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

675 lines
73 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-03-31 02:17:21 +03:00
<title>4/tm</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2020-02-27 13:18:25 +02:00
<!--Weave of '5/es' generated by 7-->
2020-03-31 02:17:21 +03:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Extension Services</b></li></ul><p class="purpose">Behaviour specific to copies of the extension genre.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<ul class="toc"><li><a href="#SP1">&#167;1. Scanning metadata</a></li><li><a href="#SP3">&#167;3. Read source text</a></li><li><a href="#SP5">&#167;5. Miscellaneous</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Scanning metadata. </b>An extension has a title and an author name, each of which is limited in
2020-03-30 15:25:23 +03:00
length to one character less than the following constants:
</p>
2020-02-27 13:18:25 +02:00
2020-03-30 15:25:23 +03:00
<pre class="definitions">
2020-04-07 03:06:09 +03:00
<span class="definitionkeyword">define</span> <span class="constant">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain"> </span><span class="constant">51</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain"> </span><span class="constant">51</span>
2020-03-30 15:25:23 +03:00
</pre>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_extension</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">as_copy</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">body_text</span><span class="plain">; </span><span class="comment">Body of source text supplied in extension, if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">body_text_unbroken</span><span class="plain">; </span><span class="comment">Does this contain text waiting to be sentence-broken?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">documentation_text</span><span class="plain">; </span><span class="comment">Documentation supplied in extension, if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">standard</span><span class="plain">; </span><span class="comment">the (or perhaps just a) Standard Rules extension</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">authorial_modesty</span><span class="plain">; </span><span class="comment">Do not credit in the compiled game</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">rubric_as_lexed</span><span class="plain">; </span><span class="comment">brief description found in opening lines</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">extra_credit_as_lexed</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">read_into_file</span><span class="plain">; </span><span class="comment">Which source file loaded this</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">must_satisfy</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">loaded_from_built_in_area</span><span class="plain">; </span><span class="comment">Located within Inform application</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">syntax_tree</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">inclusion_sentence</span><span class="plain">; </span><span class="comment">Where the source called for this</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_extension</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure inform_extension is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/kts, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This is called as soon as a new copy <code class="display"><span class="extract">C</span></code> of the extension genre is created.
We scan the extension file for the title, author, version number and any
compatibility notes given (such as "for Glulx only").
</p>
<pre class="display">
2020-03-29 16:48:19 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::scan</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="functiontext">Copies::set_content</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">STORE_POINTER_inform_extension</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">));</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Initialise the extension docket</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reqs</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">VersionNumbers::null</span><span class="plain">();</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Scan the file</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Change the edition of the copy in light of the metadata found in the scan</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-30 15:25:23 +03:00
<p class="endnote">The function Extensions::scan is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the extension docket</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text_unbroken</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">documentation_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">standard</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">authorial_modesty</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">read_into_file</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="element">rubric_as_lexed</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">extra_credit_as_lexed</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="element">must_satisfy</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="element">loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">syntax_tree</span><span class="plain"> = </span><span class="identifier">ParseTree::new_tree</span><span class="plain">();</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">inclusion_sentence</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b>The following scans a potential extension file. If it seems malformed, a
2020-02-27 13:18:25 +02:00
suitable error is written to the stream <code class="display"><span class="extract">error_text</span></code>. If not, this is left
alone, and the version number is returned.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Scan the file</span> <span class="cwebmacronumber">2.2</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_file</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">EXTF</span><span class="plain"> = </span><span class="identifier">Filenames::fopen_caseless</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EXTF</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
2020-03-29 19:39:17 +03:00
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_F</span><span class="plain">(</span><span class="constant">OPEN_FAILED_CE</span><span class="plain">, -1, </span><span class="identifier">F</span><span class="plain">));</span>
2020-02-27 13:18:25 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the rubric text, if any is present</span> <span class="cwebmacronumber">2.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">2.2.3</span>&gt;<span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">EXTF</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">V</span><span class="plain"> = </span><span class="identifier">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">version_text</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">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">error_text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">error_text</span><span class="plain">, </span><span class="string">"the version number '%S' is malformed"</span><span class="plain">, </span><span class="identifier">version_text</span><span class="plain">);</span>
2020-03-29 19:39:17 +03:00
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">error_text</span><span class="plain">));</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">error_text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b>The titling line is terminated by 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">0A 0D</span></code> or <code class="display"><span class="extract">0D 0A</span></code>, or
2020-02-27 13:18:25 +02:00
by the local <code class="display"><span class="extract">\n</span></code> for good measure.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">TextFiles::utf8_fgetc</span><span class="plain">(</span><span class="identifier">EXTF</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">)) != </span><span class="identifier">EOF</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xFEFF</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">; </span><span class="comment">skip the optional Unicode BOM pseudo-character</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0d'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\n'</span><span class="plain">)) </span><span class="reserved">break</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Works::normalise_casing</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_2"></a><b>&#167;2.2.2. </b>In the following, all possible newlines are converted to white space, and
2020-02-27 13:18:25 +02:00
all white space before a quoted rubric text is ignored. We need to do this
partly because users have probably keyed a double line break before the
rubric, but also because we might have stopped reading the titling line
halfway through a line division combination like <code class="display"><span class="extract">0A 0D</span></code>, so that the first
thing we read here is a meaningless <code class="display"><span class="extract">0D</span></code>.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Read the rubric text, if any is present</span> <span class="cwebmacronumber">2.2.2</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">, </span><span class="identifier">found_start</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">TextFiles::utf8_fgetc</span><span class="plain">(</span><span class="identifier">EXTF</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">)) != </span><span class="identifier">EOF</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0d'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\n'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="identifier">c</span><span class="plain"> = </span><span class="character">' '</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">' '</span><span class="plain">) &amp;&amp; (</span><span class="identifier">found_start</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">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">) </span><span class="identifier">found_start</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_start</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">rubric_as_lexed</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_3"></a><b>&#167;2.2.3. </b>In general, once case-normalised, a titling line looks like this:
2020-02-27 13:18:25 +02:00
</p>
<blockquote>
<p>Version 2/070423 Of Going To The Zoo (For Glulx Only) By Cary Grant Begins Here.</p>
</blockquote>
<p class="inwebparagraph">and the version information, the VM restriction and the full stop are all
optional, but the division word "of" and the concluding "begin[s] here"
are not. We break it up into pieces; for speed, we won't use the lexer to
load the entire file.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">2.2.3</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">) == </span><span class="character">'.'</span><span class="plain">) </span><span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) Begin Here"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) Begins Here"</span><span class="plain">))) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) Start Here"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) Starts Here"</span><span class="plain">))) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1,</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">I</span><span class="string">"the opening line does not end 'begin(s) here'"</span><span class="plain">));</span>
<span class="plain">}</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">2.2.3.1</span>&gt;<span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"The (%c*)"</span><span class="plain">)) </span><span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">2.2.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">2.2.3.3</span>&gt;<span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_3_1"></a><b>&#167;2.2.3.1. </b>We make no attempt to check the version number for validity: the purpose
2020-02-27 13:18:25 +02:00
of the census is to identify extensions and reject accidentally included
other files, not to syntax-check all extensions to see if they would work
if used.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">2.2.3.1</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Version (%c*?) Of (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_3_2"></a><b>&#167;2.2.3.2. </b>The earliest "by" is the divider: note that extension titles are not
2020-02-27 13:18:25 +02:00
allowed to contain this word, so "North By Northwest By Cary Grant" is
not a situation we need to contend with.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">2.2.3.2</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) By (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">);</span>
2020-03-29 19:39:17 +03:00
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1,</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">I</span><span class="string">"the titling line does not give both author and title"</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP2_2_3_3"></a><b>&#167;2.2.3.3. </b>Similarly, extension titles are not allowed to contain parentheses, so
2020-02-27 13:18:25 +02:00
this is unambiguous.
</p>
<p class="macrodefinition"><code class="display">
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacrodefn">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">2.2.3.3</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *(%(%c*%))"</span><span class="plain">)) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b>Note that we don't attempt to modify the <code class="display"><span class="extract">inbuild_work</span></code> structure inside
the edition; we create an entirely new <code class="display"><span class="extract">inbuild_work</span></code>. That's because they
are immutable, and need to be for the extensions dictionary to work.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Change the edition of the copy in light of the metadata found in the scan</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="string">"Unknown"</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">claimed_author_name</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">, </span><span class="string">"Anonymous"</span><span class="plain">); }</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_TITLE_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">)));</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">claimed_author_name</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_AUTHOR_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">)));</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain"> = </span><span class="functiontext">Editions::new</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">claimed_author_name</span><span class="plain">), </span><span class="identifier">V</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">reqs</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
2020-03-31 02:17:21 +03:00
<span class="identifier">compatibility_specification</span><span class="plain"> *</span><span class="identifier">CS</span><span class="plain"> = </span><span class="identifier">Compatibility::from_text</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CS</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="element">compatibility</span><span class="plain"> = </span><span class="identifier">CS</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"cannot read compatibility '%S'"</span><span class="plain">, </span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Read source text. </b>The scan only skimmed the surface of the file, and didn't try to parse it as
natural language text with Preform. But if the extension turns out to be one
that we need to use for something, we'll need to read its full text eventually.
This is that time.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::read_source_text_for</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">location_if_file</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">doc_only</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">census_mode</span><span class="plain">) </span><span class="identifier">doc_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Concoct a synopsis for the extension to be read</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">read_into_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">doc_only</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
2020-03-31 02:17:21 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">read_into_file</span><span class="plain">) {</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">read_into_file</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain"> = </span><span class="identifier">STORE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">);</span>
2020-03-31 02:17:21 +03:00
&lt;<span class="cwebmacro">Break the text into sentences</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text_unbroken</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::read_source_text_for is used in 4/em (<a href="4-em.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>We concoct a textual synopsis in the form
</p>
<pre class="display">
<span class="plain">"Pantomime Sausages by Mr Punch"</span>
</pre>
<p class="inwebparagraph">to be used by <code class="display"><span class="extract">SourceFiles::read_extension_source_text</span></code> for printing to <code class="display"><span class="extract">stdout</span></code>. Since
we dare not assume <code class="display"><span class="extract">stdout</span></code> can manage characters outside the basic ASCII
range, we flatten them from general ISO to plain ASCII.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Concoct a synopsis for the extension to be read</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">, </span><span class="string">"%S by %S"</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">,</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
2020-03-31 02:17:21 +03:00
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">)</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">,</span>
<span class="identifier">Characters::make_filename_safe</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>Note that if there is an active project, then we are reading the extension
in order to include it in that, and so we send it to the project's syntax tree,
rather than to the extension's own one. But if we are simply examining the
extension by running <code class="display"><span class="extract">-graph</span></code> on it in the Inbuild command line, for example,
then its sentences will go to the extension's own tree.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Break the text into sentences</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">EXW</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">read_into_file</span><span class="plain">-&gt;</span><span class="identifier">text_read</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">EXW</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">3.2.2</span>&gt;<span class="character">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">Inbuild::project</span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain">) </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">syntax_tree</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-&gt;</span><span class="element">syntax_tree</span><span class="plain">;</span>
<span class="identifier">Sentences::break_into_extension_copy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">syntax_tree</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text_unbroken</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1"></a><b>&#167;3.2.1. </b>If an extension file contains the special text (outside literal mode) of
</p>
<pre class="display">
2020-04-08 01:02:44 +03:00
<span class="plain">---- </span><span class="identifier">Documentation</span><span class="plain"> ----</span>
2020-03-31 02:17:21 +03:00
</pre>
<p class="inwebparagraph">then this is taken as the end of the Inform source, and the beginning of a
snippet of documentation about the extension; text from that point on is
saved until later, but not broken into sentences for the parse tree, and it
is therefore invisible to the rest of Inform. If this division line is not
present then the extension contains only body source and no documentation.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">body</span><span class="plain">&gt; ::=</span>
<span class="plain">*** ---- </span><span class="identifier">documentation</span><span class="plain"> ---- ... | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">... ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3_2_2"></a><b>&#167;3.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">3.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">body</span><span class="plain">&gt;(</span><span class="identifier">EXW</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">body</span><span class="plain">&gt;, </span><span class="constant">1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">documentation_text</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">body</span><span class="plain">&gt;, </span><span class="constant">2</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">body_text_unbroken</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="comment">mark this to be sentence-broken</span>
2020-03-31 02:17:21 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2">&#167;3.2</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>When the extension source text was read from its <code class="display"><span class="extract">source_file</span></code>, we
attached a reference to say which <code class="display"><span class="extract">inform_extension</span></code> it was, and here we
make use of that:
</p>
<pre class="display">
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="functiontext">Extensions::corresponding_to</span><span class="plain">(</span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">RETRIEVE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain"> != </span><span class="identifier">extension_genre</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">ExtensionManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::corresponding_to is used in 6/hdn (<a href="6-hdn.html#SP19">&#167;19</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Miscellaneous. </b></p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::write</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inform_extension</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">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"none"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%X"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::write_name_to_file</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03: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="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::write_author_to_file</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03: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="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::write appears nowhere else.</p>
<p class="endnote">The function Extensions::write_name_to_file appears nowhere else.</p>
<p class="endnote">The function Extensions::write_author_to_file appears nowhere else.</p>
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Three pieces of information will be set later on, by other parts of Inform
calling the routines below.
2020-02-27 13:18:25 +02:00
</p>
<p class="inwebparagraph">The rubric text for an extension, which is double-quoted matter just below
its "begins here" line, is parsed as a sentence and will be read as an
assertion in the usual way when the material from this extension is being
worked through (quite a long time after the EF structure was created). When
that happens, the following routine will be called to set the rubric; and
the one after for the optional extra credit line, used to acknowledge I6
sources, collaborators, translators and so on.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_rubric</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</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>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">rubric_as_lexed</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTENSIONS_CENSUS</span><span class="plain">, </span><span class="string">"Extension rubric: %S\n"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">rubric_as_lexed</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Extensions::get_rubric</span><span class="plain">(</span><span class="reserved">inform_extension</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">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">rubric_as_lexed</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_extra_credit</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</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>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">extra_credit_as_lexed</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTENSIONS_CENSUS</span><span class="plain">, </span><span class="string">"Extension extra credit: %S\n"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">extra_credit_as_lexed</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::set_rubric appears nowhere else.</p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The function Extensions::get_rubric is used in 7/ec (<a href="7-ec.html#SP2">&#167;2</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Extensions::set_extra_credit appears nowhere else.</p>
2020-03-31 02:17:21 +03:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The use option "authorial modesty" is unusual in applying to the extension
2020-02-27 13:18:25 +02:00
it is found in, not the whole source text. When we read it, we call one of
the following routines, depending on whether it was in an extension or in
the main source text:
</p>
<pre class="display">
<span class="reserved">int</span><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="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_authorial_modesty</span><span class="plain">(</span><span class="reserved">inform_extension</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">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>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">authorial_modesty</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_general_authorial_modesty</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">general_authorial_modesty</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_inclusion_sentence</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">inclusion_sentence</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">Extensions::get_inclusion_sentence</span><span class="plain">(</span><span class="reserved">inform_extension</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">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">inclusion_sentence</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::is_standard</span><span class="plain">(</span><span class="reserved">inform_extension</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">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">standard</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::make_standard</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">standard</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::must_satisfy</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">must_satisfy</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="element">must_satisfy</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">must_satisfy</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::satisfies</span><span class="plain">(</span><span class="reserved">inform_extension</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">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Requirements::meets</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="element">must_satisfy</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::set_authorial_modesty appears nowhere else.</p>
<p class="endnote">The function Extensions::set_general_authorial_modesty appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Extensions::set_inclusion_sentence is used in 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Extensions::get_inclusion_sentence is used in 6/inc (<a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Extensions::is_standard appears nowhere else.</p>
2020-03-30 15:25:23 +03:00
<p class="endnote">The function Extensions::make_standard is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="endnote">The function Extensions::must_satisfy is used in 6/inc (<a href="6-inc.html#SP6">&#167;6</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Extensions::satisfies appears nowhere else.</p>
<hr class="tocbar">
2020-03-31 02:17:21 +03:00
<ul class="toc"><li><i>(This section begins Chapter 5: Genre Services.)</i></li><li><a href="5-kts.html">Continue with 'Kits'</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>