1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/core-module/8-ef.html

782 lines
84 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>7/rs</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '8/ef' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#8">Chapter 8: Extensions</a></li><li><b>Extension Files</b></li></ul><p class="purpose">To keep details of the extensions currently loaded, their authors, titles, versions and rubrics, and to index and credit them suitably.</p>
2020-02-27 03:43:11 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. How the application should install extensions</a></li><li><a href="#SP4">&#167;4. The extension census</a></li><li><a href="#SP5">&#167;5. What happens in census mode</a></li><li><a href="#SP8">&#167;8. Checking version numbers</a></li><li><a href="#SP9">&#167;9. Credit for extensions</a></li><li><a href="#SP11">&#167;11. Indexing extensions in the Contents index</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Extensions are files of source text, normally combined with an appendix
of documentation, provided by third parties for users to include with the
source text of their own projects. Extensions are intended to provide general
solutions to typical needs, and an archive of extensions for download is
provided by the Inform website: those are licenced by their authors with
a Creative Commons Attribution licence, and because of that, Inform behaves
as if all extensions it sees require attribution (unless the author requests
anonymity). A user of Inform 7 will certainly have nine or ten extensions
available to him, because that many are built into the standard distribution:
as of 2007 it is typical for users to have installed 50 to 90 others, and
the total is steadily rising. Our routines here therefore need to be
scalable.
</p>
<p class="inwebparagraph">Extensions are stored in two places: a built-in area, inside the Inform 7
2019-03-19 01:36:20 +02:00
application, and an external area. Inform knows the location of the former
2019-03-17 14:40:57 +02:00
because the application passes this as <code class="display"><span class="extract">-rules</span></code> on the command line, and it
knows the location of the latter because this is standard and fixed for
each platform: see Platform-Specific Definitions.
</p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. How the application should install extensions. </b>When the Inform 7 application looks at a file chosen by the user to
2019-03-17 14:40:57 +02:00
be installed, it should look at the first line. (Note that this might have
any of <code class="display"><span class="extract">0a</span></code>, <code class="display"><span class="extract">0d</span></code>, <code class="display"><span class="extract">0a0d</span></code>, <code class="display"><span class="extract">0d0a</span></code>, or Unicode line division as its line
ending: and that the file might, or might not, begin with a Unicode BOM,
"byte order marker", code. Characters within the line will be encoded as
UTF-8, though &mdash; except possibly for some exotic forms of space &mdash; they
will all be found in the ISO Latin-1 set.) The first line is required to
have one of the following forms, possibly with white space before or after,
but definitely without line breaks before:
</p>
<blockquote>
<p>Locksmith Extra by Emily Short begins here.</p>
</blockquote>
<blockquote>
<p>Version 2 of Locksmith Extra by Emily Short begins here.</p>
</blockquote>
<blockquote>
<p>Version 060430 of Locksmith Extra by Emily Short begins here.</p>
</blockquote>
<blockquote>
<p>Version 2/060430 of Locksmith Extra by Emily Short begins here.</p>
</blockquote>
<p class="inwebparagraph">If the name of the extension finishes with a bracketed clause, that
should be disregarded. Such clauses are used to specify virtual machine
requirements, at present, and could conceivably be used for other purposes
later, so let's reserve them now.
</p>
<blockquote>
<p>Version 2 of Glulx Text Effects (for Glulx only) by Emily Short begins here.</p>
</blockquote>
<p class="inwebparagraph">The application should reject (that is, politely refuse to install) any
purported extension file whose first line does not conform to the above.
</p>
<p class="inwebparagraph">Ignoring any version number given, the Inform application should then
store the file in the external extensions area. For instance,
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">~/Library/Inform/Extensions/Emily Short/Glulx Text Effects</span>
(OS X) <span class="plain">My Documents\Inform\Extensions\Emily Short\Glulx Text Effects</span>
(Windows)</pre>
<p class="inwebparagraph">Note that the file will probably not have the right name initially, and
will need to be renamed as well as moved. (Note the lack of a file
extension.) The subfolders <code class="display"><span class="extract">Inform</span></code>, <code class="display"><span class="extract">Extensions</span></code> and <code class="display"><span class="extract">Emily Short</span></code> must be
created if not already present.
</p>
<p class="inwebparagraph">If to install such an extension would result in over-writing an extension
already present at that filename, the user should be given a warning and
asked if he wants to proceed.
</p>
<p class="inwebparagraph">However, note that it is not an error to install an extension with
the same name and author as one in the built-in extensions folder. This
does not result in overwriting, since the newly installed version will live
in the external area, not the built-in area.
</p>
<p class="inwebparagraph">An extension may be uninstalled simply by deleting the file: but the
application must not allow the user to uninstall any extension from
the built-in area. We must assume that the latter could be on a read-only
disc, or could be part of a cryptographically signed application bundle.
</p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. The extension census. </b>The Inform application should run Inform in "census mode" in order to
2019-03-19 01:36:20 +02:00
keep extension documentation up to date. Inform should be run in census mode
2019-03-17 14:40:57 +02:00
on three occasions:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) when the Inform application starts up;
</li><li>(b) when the Inform application installs a new extension;
</li><li>(c) when the Inform application uninstalls an extension.
</li></ul>
2019-03-19 01:36:20 +02:00
<p class="inwebparagraph">When Inform is run in "census mode", it should be run with the command
2019-03-17 14:40:57 +02:00
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">ni -rules (...) -census</span>
</pre>
<p class="inwebparagraph">where the argument for <code class="display"><span class="extract">-rules</span></code> is the same as for any other run. All
2019-03-19 01:36:20 +02:00
output from Inform should be ignored, including its return code: ideally,
2019-03-17 14:40:57 +02:00
not even a fatal error should provoke a reaction from the application.
If the census doesn't work for some file-system reason, never mind &mdash;
it's not mission-critical.
</p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. What happens in census mode. </b>The census has two purposes: first, to create provisional documentation
2019-03-17 14:40:57 +02:00
where needed for new and unused extensions; and second, to create the
following index files in the external documentation area (not in
the external extension area):
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">.../Extensions.html</span>
(basically a contents page) <span class="plain">.../ExtIndex.html</span>
(basically an index)</pre>
<p class="inwebparagraph">Documentation for any individual extension is stored at, e.g.,
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">.../Extensions/Victoria Saxe-Coburg-Gotha/Werewolves.html</span>
</pre>
2019-03-19 01:36:20 +02:00
<p class="inwebparagraph">Inform can generate such a file, for an individual extension, in two ways: (a)
2019-03-17 14:40:57 +02:00
provisionally, with much less detail, and (b) fully. Whenever it
successfully compiles a work using extension X, it rewrites the
documentation for X fully, and updates both the two indexing pages.
</p>
2019-03-19 01:36:20 +02:00
<p class="inwebparagraph">When Inform runs in <code class="display"><span class="extract">-census</span></code> mode, what it does is to scan for all extensions.
If Inform finds a valid extension with no documentation page, it writes a
2019-03-17 14:40:57 +02:00
provisional one; and again, it updates both the two indexing pages.
</p>
2019-03-19 01:36:20 +02:00
<p class="inwebparagraph">(Inform in fact runs a census on every compilation, as well, so <code class="display"><span class="extract">-census</span></code> runs
do nothing "extra" that a normal run of Inform does not also do. On every
census, Inform automatically checks for misfiled or broken extensions, and
2019-03-17 14:40:57 +02:00
places a descriptive report of what's wrong on the <code class="display"><span class="extract">Extensions.html</span></code> index
page &mdash; if people move around or edit extensions by hand, they may run into
these errors.)
</p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>With that general discussion out of the way, we can get on with
2019-03-17 14:40:57 +02:00
implementation. A modest structure is used to store details of extension
2019-03-19 01:36:20 +02:00
files loaded into Inform: or rather, to store requests to include them, and then
2019-03-17 14:40:57 +02:00
to keep track of the results.
</p>
<p class="inwebparagraph">The rubric of an extension is text found near its opening, describing
its purpose.
</p>
<pre class="display">
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>We begin with some housekeeping, really: the code required to create new
2019-03-17 14:40:57 +02:00
extension file structures, and to manage existing ones.
</p>
<pre class="display">
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Checking version numbers. </b>It's only at the end of semantic analysis, when all extensions have been
2019-03-17 14:40:57 +02:00
loaded, that we check that all the version numbers are sufficient to meet
the requests made. The reason we don't do this one at a time, as we load
them in, is that we might load E at a time when version V is required,
and find that it matches; but then an extension loaded later might turn out
to require E version V+1. So it is only when all extensions have been
loaded that we know the full set of requirements, and only then do we
check that they have been met.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::check_versions</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::satisfies</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">version</span><span class="plain">;</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">Extensions::get_inclusion_sentence</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">Problems::quote_extension</span><span class="plain">(2, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">have</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">vn</span><span class="plain">);</span>
<span class="identifier">VersionNumbers::to_text</span><span class="plain">(</span><span class="identifier">vn</span><span class="plain">, </span><span class="identifier">have</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(3, </span><span class="identifier">vn</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1: but my copy of %2 is only version %3."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">vn</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1: but my copy of %2 contains no version "</span>
<span class="string">"number, and is therefore considered to be earlier than "</span>
<span class="string">"all numbered versions."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Extensions::Files::check_versions is used in 1/htc (<a href="1-htc.html#SP2_4">&#167;2.4</a>).</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Credit for extensions. </b>Here we compile an I6 routine to print out credits for all the extensions
2019-03-17 14:40:57 +02:00
present in the compiled work. This is important because the extensions
published at the Inform website are available under a Creative Commons
license which requires users to give credit to the authors: Inform
ensures that this happens automatically.
</p>
<p class="inwebparagraph">Use of authorial modesty (see above) will suppress a credit in the
<code class="display"><span class="extract">ShowExtensionVersions</span></code> routine, but the system is set up so that one can
only be modest about one's own extensions: this would otherwise violate a
CC license of somebody else. General authorial modesty thus suppresses
credits for all extensions used which are by the user himself. On the
other hand, if an extension contains an authorial modesty disclaimer
in its own text, then that must have been the wish of its author, so
we can suppress the credit whoever that author was.
</p>
<p class="inwebparagraph">In <code class="display"><span class="extract">I7FullExtensionVersions</span></code> all extensions are credited whatever anyone's
feelings of modesty.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::ShowExtensionVersions_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SHOWEXTENSIONVERSIONS_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">the_author_name</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">the_author_name</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">author_name</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">self_penned</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PL::Bibliographic::story_author_is</span><span class="plain">(</span><span class="identifier">the_author_name</span><span class="plain">)) </span><span class="identifier">self_penned</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">authorial_modesty</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &amp;&amp; </span> <span class="comment">if (1) extension doesn't ask to be modest</span>
2019-03-17 14:40:57 +02:00
<span class="plain">((</span><span class="identifier">general_authorial_modesty</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || </span> <span class="comment">and (2) author doesn't ask to be modest, or...</span>
<span class="plain">(</span><span class="identifier">self_penned</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))) { </span> <span class="comment">...didn't write this extension</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">Extensions::Files::credit_ef</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">); </span> <span class="comment">then we award a credit</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">the_author_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SHOWFULLEXTENSIONVERSIONS_HL</span><span class="plain">);</span>
<span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">Extensions::Files::credit_ef</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SHOWONEEXTENSION_HL</span><span class="plain">);</span>
<span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">id_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"id"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">id_s</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> + 1));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">Extensions::Files::credit_ef</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Extensions::Files::ShowExtensionVersions_routine is used in 1/htc (<a href="1-htc.html#SP2_9">&#167;2.9</a>).</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The actual credit consists of a single line, with name, version number
2019-03-17 14:40:57 +02:00
and author. These are printed as I6 strings, hence the ISO encoding.
</p>
<pre class="display">
2020-02-27 03:43:11 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::credit_ef</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">with_newline</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unfound ef"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">raw_title</span><span class="plain">);</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">version</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" version %v"</span><span class="plain">, &amp;</span><span class="identifier">V</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by %S"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">raw_author_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">extra_credit_as_lexed</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (%S)"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">extra_credit_as_lexed</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">with_newline</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">The function Extensions::Files::credit_ef is used in <a href="#SP9">&#167;9</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Indexing extensions in the Contents index. </b>The routine below places a list of extensions used in the Contents index,
2019-03-17 14:40:57 +02:00
giving only minimal entries about them.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"EXTENSIONS"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Extensions::Files::index_extensions_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">Extensions::Files::index_extensions_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">))</span>
<span class="functiontext">Extensions::Files::index_extensions_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::index_extensions_from</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">show_head</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">) {</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">Extensions::get_inclusion_sentence</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">))) {</span>
<span class="identifier">source_location</span><span class="plain"> </span><span class="identifier">sl</span><span class="plain"> = </span><span class="identifier">Wordings::location</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">.</span><span class="identifier">file_of_origin</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">owner</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">))));</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner</span><span class="plain"> != </span><span class="identifier">from</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">show_head</span><span class="plain">) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"808080"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Included "</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"automatically by Inform"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"from the source text"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"by the extension %S"</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">title</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="identifier">show_head</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"ul"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">leaders\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"li"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">leaded indent2\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S "</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">Works::begin_extension_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"border=0 src=inform:/doc_images/help.png"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Works::end_extension_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) { </span> <span class="comment">give author and inclusion links, but not for SR</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by %X"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">author_name</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">version</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">smaller\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">version</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"version %v"</span><span class="plain">, &amp;</span><span class="identifier">V</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">extra_credit_as_lexed</span><span class="plain">) &gt; 0) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">smaller\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(%S)"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">extra_credit_as_lexed</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d words"</span><span class="plain">, </span><span class="identifier">TextFromFiles::total_word_count</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">Extensions::get_inclusion_sentence</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">))));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"li"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"ul"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Files::index appears nowhere else.</p>
<p class="endnote">The function Extensions::Files::index_extensions_from appears nowhere else.</p>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>Nothing can prevent a certain repetitiousness intruding here, but there is
just enough local knowledge required to make it foolhardy to try to automate
this from a dump of the excerpt meanings table (say). The ordering of
paragraphs, as in Roget's Thesaurus, tries to proceed from solid things
through to diffuse linguistic ones. But the reader of the resulting
documentation page could be forgiven for thinking it a miscellany.
2019-03-17 14:40:57 +02:00
</p>
<pre class="display">
2020-02-27 03:43:11 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Files::document_in_detail</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="identifier">Extensions::Dictionary::erase_entries</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">) </span><span class="identifier">Extensions::Dictionary::time_stamp</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Document and dictionary the kinds made in extension</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the objects made in extension</span> <span class="cwebmacronumber">12.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the global variables made in extension</span> <span class="cwebmacronumber">12.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the enumerated constant values made in extension</span> <span class="cwebmacronumber">12.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the kinds of action made in extension</span> <span class="cwebmacronumber">12.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the actions made in extension</span> <span class="cwebmacronumber">12.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the verbs made in extension</span> <span class="cwebmacronumber">12.7</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the adjectival phrases made in extension</span> <span class="cwebmacronumber">12.8</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the property names made in extension</span> <span class="cwebmacronumber">12.9</span>&gt;<span class="plain">;</span>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
&lt;<span class="cwebmacro">Document and dictionary the use options made in extension</span> <span class="cwebmacronumber">12.10</span>&gt;<span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">The function Extensions::Files::document_in_detail appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b>Off we go, then. Kinds of object:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the kinds made in extension</span> <span class="cwebmacronumber">12.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_BASE_KINDS</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_creating_sentence</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">))) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Kinds"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kind"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Kinds::Compare::super</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (a kind of %+W)"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12_2"></a><b>&#167;12.2. </b>Actual objects:
2019-03-17 14:40:57 +02:00
</p>
2020-02-27 03:43:11 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the objects made in extension</span> <span class="cwebmacronumber">12.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="functiontext">Instances::get_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span>
<span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="functiontext">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">))))</span>
<span class="plain">== </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k</span><span class="plain"> = </span><span class="functiontext">Instances::to_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name_of_its_kind</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">,</span>
<span class="string">"Physical creations"</span><span class="plain">, </span><span class="identifier">name_of_its_kind</span><span class="plain">, </span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (a %S)"</span><span class="plain">, </span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12_3"></a><b>&#167;12.3. </b>Global variables:
2019-03-17 14:40:57 +02:00
</p>
2020-02-27 03:43:11 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the global variables made in extension</span> <span class="cwebmacronumber">12.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="reserved">nonlocal_variable</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) &gt;= 0) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">NonlocalVariables::is_global</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Sentences::Headings::indexed</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)))) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">value</span><span class="plain">-</span><span class="identifier">understood</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Values that vary"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"value"</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_4"></a><b>&#167;12.4. </b>Constants:
2019-03-17 14:40:57 +02:00
</p>
2020-02-27 03:43:11 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the enumerated constant values made in extension</span> <span class="cwebmacronumber">12.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_ENUMERATION_INSTANCES</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">NW</span><span class="plain"> = </span><span class="functiontext">Instances::get_name</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Values"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"value"</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12_5"></a><b>&#167;12.5. </b>Kinds of action:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the kinds of action made in extension</span> <span class="cwebmacronumber">12.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">PL::Actions::Patterns::Named::index_for_extension</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_6"></a><b>&#167;12.6. </b>Actions:
2019-03-17 14:40:57 +02:00
</p>
2020-02-27 03:43:11 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the actions made in extension</span> <span class="cwebmacronumber">12.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">PL::Actions::Index::index_for_extension</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12_7"></a><b>&#167;12.7. </b>Verbs (this one we delegate):
</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the verbs made in extension</span> <span class="cwebmacronumber">12.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Index::Lexicon::list_verbs_in_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_8"></a><b>&#167;12.8. </b>Adjectival phrases:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the adjectival phrases made in extension</span> <span class="cwebmacronumber">12.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">adj</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">adj</span><span class="plain">, </span><span class="identifier">adjectival_phrase</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Adjectives::get_text</span><span class="plain">(</span><span class="identifier">adj</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Adjectives"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"adjective"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_9"></a><b>&#167;12.9. </b>Other adjectives:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the property names made in extension</span> <span class="cwebmacronumber">12.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Properties::is_shown_in_index</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Properties"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"property"</span><span class="plain">,</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
2019-03-17 14:40:57 +02:00
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP12_10"></a><b>&#167;12.10. </b>Use options:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the use options made in extension</span> <span class="cwebmacronumber">12.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) &gt;= 0) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="string">"Use options"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"use option"</span><span class="plain">,</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Finally, the utility routine which keeps count (hence <code class="display"><span class="extract">kc</span></code>) and displays
suitable lists, while entering each entry in turn into the extension
dictionary.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::Files::document_headword</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">par_heading</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain">++ == 0) { </span><span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s: "</span><span class="plain">, </span><span class="identifier">par_heading</span><span class="plain">); }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;%+W&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">Extensions::Dictionary::new_entry</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
<p class="endnote">The function Extensions::Files::document_headword is used in <a href="#SP12_1">&#167;12.1</a>, <a href="#SP12_2">&#167;12.2</a>, <a href="#SP12_3">&#167;12.3</a>, <a href="#SP12_4">&#167;12.4</a>, <a href="#SP12_8">&#167;12.8</a>, <a href="#SP12_9">&#167;12.9</a>, <a href="#SP12_10">&#167;12.10</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>And that at last brings us to a milestone: the end of the Land of Extensions.
We can return to Inform's more usual concerns.
</p>
2019-03-17 14:40:57 +02:00
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 8: Extensions.)</i></li><li><a href="8-ie.html">Continue with 'Including Extensions'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2019-03-17 14:40:57 +02:00
</body>
</html>