1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-01 07:48:35 +03:00

Presentational improvements

This commit is contained in:
Graham Nelson 2020-02-27 01:43:11 +00:00
parent 528c68ce07
commit 0b70407916
126 changed files with 5989 additions and 3171 deletions

View file

@ -11,41 +11,21 @@
<!--Weave of '1/arc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Architecture</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Architectures</a></li><li><a href="#SP2">&#167;2. Prepare stage</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Current architecture</a></li><li><a href="#SP2">&#167;2. Prepare stage</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Architectures. </b>These are simply enumerated, for now.
</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Current architecture. </b></p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">NO_ARCHITECTURE</span><span class="definitionkeyword"> from </span><span class="constant">0</span>
<span class="definitionkeyword">enum</span> <span class="constant">A_16_ARCHITECTURE</span>
<span class="definitionkeyword">enum</span> <span class="constant">A_16D_ARCHITECTURE</span>
<span class="definitionkeyword">enum</span> <span class="constant">A_32_ARCHITECTURE</span>
<span class="definitionkeyword">enum</span> <span class="constant">A_32D_ARCHITECTURE</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_architecture</span><span class="plain"> = </span><span class="constant">NO_ARCHITECTURE</span><span class="plain">;</span>
<span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">current_architecture</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::set</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">setting</span><span class="plain"> = </span><span class="constant">NO_ARCHITECTURE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"16"</span><span class="plain">)) </span><span class="identifier">setting</span><span class="plain"> = </span><span class="constant">A_16_ARCHITECTURE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"32"</span><span class="plain">)) </span><span class="identifier">setting</span><span class="plain"> = </span><span class="constant">A_32_ARCHITECTURE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"16d"</span><span class="plain">)) </span><span class="identifier">setting</span><span class="plain"> = </span><span class="constant">A_16D_ARCHITECTURE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"32d"</span><span class="plain">)) </span><span class="identifier">setting</span><span class="plain"> = </span><span class="constant">A_32D_ARCHITECTURE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">setting</span><span class="plain"> == </span><span class="constant">NO_ARCHITECTURE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">current_architecture</span><span class="plain"> = </span><span class="identifier">setting</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">current_architecture</span><span class="plain"> = </span><span class="identifier">Architectures::from_codename</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_architecture</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">CodeGen::Architecture::leafname</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">current_architecture</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_16_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"arch-16"</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_16D_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"arch-16d"</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_32_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"arch-32"</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_32D_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"arch-32d"</span><span class="plain">;</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="identifier">inter_architecture</span><span class="plain"> *</span><span class="functiontext">CodeGen::Architecture::current</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">current_architecture</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -53,7 +33,7 @@
<p class="endnote">The function CodeGen::Architecture::set appears nowhere else.</p>
<p class="endnote">The function CodeGen::Architecture::leafname is used in 1/li (<a href="1-li.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Architecture::current is used in 1/li (<a href="1-li.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Prepare stage. </b></p>
@ -64,14 +44,10 @@
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">current_architecture</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NO_ARCHITECTURE</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no architecture set"</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_16_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_16D_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_32_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">A_32D_ARCHITECTURE</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</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">current_architecture</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">"no architecture set"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">,</span>
<span class="identifier">Architectures::is_16_bit</span><span class="plain">(</span><span class="identifier">current_architecture</span><span class="plain">),</span>
<span class="identifier">Architectures::debug_enabled</span><span class="plain">(</span><span class="identifier">current_architecture</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Architecture::run_prepare_stage_inner</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">Z</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">D</span><span class="plain">) {</span>

View file

@ -48,11 +48,10 @@
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::LinkInstructions::run_link_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">link_instruction</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">link_instruction</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;requirements_list</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="string">"%S.interb"</span><span class="plain">, </span><span class="functiontext">CodeGen::Architecture::leafname</span><span class="plain">());</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">arch_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="functiontext">CodeGen::Architecture::current</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Errors::fatal</span><span class="plain">(</span><span class="string">"no -architecture given"</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">arch_file</span><span class="plain"> = </span><span class="identifier">Architectures::canonical_binary</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">arch_file</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no arch file for requirement"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">sidecar</span><span class="plain"> = </span><span class="identifier">Inter::Tree::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Binary::test_file</span><span class="plain">(</span><span class="identifier">arch_file</span><span class="plain">)) </span><span class="identifier">Inter::Binary::read</span><span class="plain">(</span><span class="identifier">sidecar</span><span class="plain">, </span><span class="identifier">arch_file</span><span class="plain">);</span>

View file

@ -27,8 +27,7 @@ have no meaningful contents when the step is not running.
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">target_argument</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">package_argument</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">parsed_filename</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">the_PP</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">the_N</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">the_PP</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">pathname</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_debugging_log</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_memory</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">repository_argument</span><span class="plain">;</span>
@ -64,7 +63,6 @@ have no meaningful contents when the step is not running.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_N</span><span class="plain"> = -1;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;to_debugging_log</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;from_memory</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_PP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -275,7 +273,7 @@ logging:
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;memory_repository</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::run</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">PP</span><span class="plain">,</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::run</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">PP</span><span class="plain">,</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">requirements_list</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">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">start</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
@ -295,7 +293,6 @@ logging:
<span class="functiontext">CodeGen::Pipeline::lint</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">);</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_N</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_PP</span><span class="plain"> = </span><span class="identifier">PP</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;pipeline</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>

View file

@ -26,11 +26,11 @@
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">main_package</span><span class="plain">) </span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::at_end_of_this_package</span><span class="plain">(</span><span class="identifier">main_package</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::at_start_of_this_repository</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="functiontext">CodeGen::MergeTemplate::link</span><span class="plain">(&amp;</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_N</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_PP</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">CodeGen::MergeTemplate::link</span><span class="plain">(&amp;</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_PP</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">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::link</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">template_file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">PP</span><span class="plain">, </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::link</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">template_file</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">PP</span><span class="plain">, </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IBM</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">"no inter to link with"</span><span class="plain">);</span>
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::tree</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">template_file</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"none"</span><span class="plain">))</span>
@ -44,8 +44,11 @@
<span class="identifier">Inter::Bookmarks::at_end_of_this_package</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">);</span>
<span class="reserved">I6T_kit</span><span class="plain"> </span><span class="identifier">kit</span><span class="plain"> = </span><span class="functiontext">TemplateReader::kit_out</span><span class="plain">(&amp;</span><span class="identifier">link_bookmark</span><span class="plain">, &amp;(</span><span class="functiontext">CodeGen::MergeTemplate::receive_raw</span><span class="plain">), &amp;(</span><span class="functiontext">CodeGen::MergeTemplate::receive_command</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">kit</span><span class="element">.no_i6t_file_areas</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">kit</span><span class="element">.i6t_files</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">PP</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Sections"</span><span class="plain">);</span>
<span class="identifier">kit</span><span class="element">.no_i6t_file_areas</span><span class="plain"> = </span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">PP</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain">, </span><span class="identifier">PP</span><span class="plain">)</span>
<span class="identifier">kit</span><span class="element">.i6t_files</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sections"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain"> = </span><span class="identifier">EARLY_LINK_STAGE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">template_file</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"none"</span><span class="plain">)) </span><span class="identifier">stage</span><span class="plain"> = </span><span class="identifier">CATCH_ALL_LINK_STAGE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>

View file

@ -30,7 +30,6 @@
<span class="definitionkeyword">enum</span> <span class="constant">inference_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">property_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">property_permission_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">extension_file_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">rulebook_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">booking_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">phrase_option_array_MT</span>
@ -52,9 +51,6 @@
<span class="definitionkeyword">enum</span> <span class="constant">pcalc_prop_deferral_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">literal_pattern_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">generalisation_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">extension_census_datum_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">extension_dictionary_entry_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">known_extension_clash_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">i6_schema_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">list_together_routine_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">past_tense_condition_record_MT</span>
@ -68,7 +64,6 @@
<span class="definitionkeyword">enum</span> <span class="constant">ph_stack_frame_box_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">i6_inclusion_matter_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">literal_list_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">extension_identifier_database_entry_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">control_structure_phrase_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">adjective_meaning_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">adjective_meaning_block_MT</span>
@ -79,7 +74,6 @@
<span class="definitionkeyword">enum</span> <span class="constant">equation_node_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">placement_affecting_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">activity_crossref_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">VM_usage_note_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">invocation_options_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inv_token_problem_token_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">application_array_MT</span>
@ -95,7 +89,6 @@
<span class="definitionkeyword">enum</span> <span class="constant">rule_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">rulebook_outcome_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">applicability_condition_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">natural_language_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">llist_entry_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">response_message_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">table_contribution_array_MT</span>
@ -114,9 +107,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">value_holster_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">adjective_iname_holder_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">label_namespace_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inform_kit_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inform_kit_ittt_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">element_activation_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">compile_task_data_MT</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Deep breath, then: the following macros define several hundred functions.
</p>
@ -138,9 +129,6 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">equation_node</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">equation_symbol</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">equation</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">extension_census_datum</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">extension_dictionary_entry</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">generalisation</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">i6_inclusion_matter</span><span class="plain">)</span>
@ -152,7 +140,6 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">internal_test_case</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inv_token_problem_token</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">kind_interaction</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">known_extension_clash</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">list_together_routine</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">literal_list</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">literal_pattern_name</span><span class="plain">)</span>
@ -162,7 +149,6 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">nascent_array</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">nonlocal_variable</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">past_tense_action_record</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">past_tense_condition_record</span><span class="plain">)</span>
@ -187,13 +173,10 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">to_phrase_request</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">use_as_event</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">use_option</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">VM_usage_note</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">runtime_kind_structure</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">adjective_iname_holder</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">label_namespace</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">compile_task_data</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"></p>
@ -206,7 +189,6 @@
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">activity_crossref</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">activity_list</span><span class="plain">, 1000)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">application</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">extension_identifier_database_entry</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">instance_usage</span><span class="plain">, 200)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">invocation_options</span><span class="plain">, 100)</span>
@ -252,14 +234,13 @@ foundation module does that automatically.)
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">booking</span><span class="plain"> *, </span><span class="functiontext">Rules::Bookings::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">table_column</span><span class="plain"> *, </span><span class="functiontext">Tables::Columns::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">pcalc_prop</span><span class="plain"> *, </span><span class="functiontext">Calculus::Propositions::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">extension_dictionary_entry</span><span class="plain"> *, </span><span class="functiontext">Extensions::Dictionary::log_entry</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="identifier">extension_dictionary_entry</span><span class="plain"> *, </span><span class="identifier">Extensions::Dictionary::log_entry</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *, </span><span class="functiontext">Invocations::log_list</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *, </span><span class="functiontext">Invocations::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *, </span><span class="functiontext">Sentences::Headings::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">ph_type_data</span><span class="plain"> *, </span><span class="functiontext">Phrases::TypeData::Textual::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">inference</span><span class="plain"> *, </span><span class="functiontext">World::Inferences::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *, </span><span class="functiontext">Calculus::Schemas::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *, </span><span class="functiontext">NaturalLanguages::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">inference_subject</span><span class="plain"> *, </span><span class="functiontext">InferenceSubjects::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *, </span><span class="functiontext">Rulebooks::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *, </span><span class="functiontext">LocalVariables::log</span><span class="plain">)</span>
@ -273,7 +254,6 @@ foundation module does that automatically.)
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">ph_usage_data</span><span class="plain"> *, </span><span class="functiontext">Phrases::Usage::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *, </span><span class="identifier">Kinds::Textual::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER_I</span><span class="plain">(</span><span class="reserved">int</span><span class="plain">, </span><span class="functiontext">Sentences::VPs::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain"> *, </span><span class="functiontext">Extensions::Files::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">property</span><span class="plain"> *, </span><span class="functiontext">Properties::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="reserved">nonlocal_variable</span><span class="plain"> *, </span><span class="functiontext">NonlocalVariables::log</span><span class="plain">)</span>
<span class="identifier">COMPILE_WRITER</span><span class="plain">(</span><span class="identifier">noun</span><span class="plain"> *, </span><span class="identifier">Nouns::log</span><span class="plain">)</span>
@ -290,7 +270,6 @@ foundation module does that automatically.)
&lt;<span class="cwebmacro">Register this module's stream writers</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="character">;</span>
&lt;<span class="cwebmacro">Register this module's debugging log aspects</span> <span class="cwebmacronumber">6.5</span>&gt;<span class="character">;</span>
&lt;<span class="cwebmacro">Register this module's debugging log writers</span> <span class="cwebmacronumber">6.6</span>&gt;<span class="character">;</span>
&lt;<span class="cwebmacro">Register this module's command line switches</span> <span class="cwebmacronumber">6.7</span>&gt;<span class="character">;</span>
<span class="plain">}</span>
</pre>
@ -304,7 +283,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">EXTENSION_DICTIONARY_MREASON</span>
<span class="definitionkeyword">enum</span> <span class="constant">INDEX_SORTING_MREASON</span>
<span class="definitionkeyword">enum</span> <span class="constant">INSTANCE_COUNTING_MREASON</span>
<span class="definitionkeyword">enum</span> <span class="constant">MAP_INDEX_MREASON</span>
@ -323,7 +301,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<pre class="displaydefn">
<span class="identifier">Memory::reason_name</span><span class="plain">(</span><span class="constant">EXTENSION_DICTIONARY_MREASON</span><span class="plain">, </span><span class="string">"extension dictionary"</span><span class="plain">);</span>
<span class="identifier">Memory::reason_name</span><span class="plain">(</span><span class="constant">INDEX_SORTING_MREASON</span><span class="plain">, </span><span class="string">"index sorting"</span><span class="plain">);</span>
<span class="identifier">Memory::reason_name</span><span class="plain">(</span><span class="constant">INSTANCE_COUNTING_MREASON</span><span class="plain">, </span><span class="string">"instance-of-kind counting"</span><span class="plain">);</span>
<span class="identifier">Memory::reason_name</span><span class="plain">(</span><span class="constant">MAP_INDEX_MREASON</span><span class="plain">, </span><span class="string">"map in the World index"</span><span class="plain">);</span>
@ -350,7 +327,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<span class="identifier">Writers::register_writer_I</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">, &amp;</span><span class="functiontext">CoreModule::writer</span><span class="plain">);</span>
<span class="identifier">Writers::register_writer</span><span class="plain">(</span><span class="character">'I'</span><span class="plain">, &amp;</span><span class="functiontext">Instances::writer</span><span class="plain">);</span>
<span class="identifier">Writers::register_writer</span><span class="plain">(</span><span class="character">'L'</span><span class="plain">, &amp;</span><span class="functiontext">LocalVariables::writer</span><span class="plain">);</span>
<span class="identifier">Writers::register_writer</span><span class="plain">(</span><span class="character">'X'</span><span class="plain">, &amp;</span><span class="functiontext">Extensions::IDs::writer</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -371,7 +347,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<span class="definitionkeyword">enum</span> <span class="constant">DEBUGGING_LOG_CONTENTS_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">DESCRIPTION_COMPILATION_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXPRESSIONS_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXTENSIONS_CENSUS_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">FIGURE_CREATIONS_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">HEADINGS_DA</span>
<span class="definitionkeyword">enum</span> <span class="constant">IMPLICATIONS_DA</span>
@ -422,7 +397,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">DEBUGGING_LOG_CONTENTS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"debugging log contents"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">DESCRIPTION_COMPILATION_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"description compilation"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">EXPRESSIONS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"expressions"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">EXTENSIONS_CENSUS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extensions census"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">FIGURE_CREATIONS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"figure creations"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">HEADINGS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"headings"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Log::declare_aspect</span><span class="plain">(</span><span class="constant">IMPLICATIONS_DA</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"implications"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
@ -474,14 +448,13 @@ we need to use the equivalent of traditional <code class="display"><span class="
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'b'</span><span class="plain">, </span><span class="functiontext">Rules::Bookings::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'C'</span><span class="plain">, </span><span class="functiontext">Tables::Columns::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'D'</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'d'</span><span class="plain">, </span><span class="functiontext">Extensions::Dictionary::log_entry</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'d'</span><span class="plain">, </span><span class="identifier">Extensions::Dictionary::log_entry</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'E'</span><span class="plain">, </span><span class="functiontext">Invocations::log_list</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'e'</span><span class="plain">, </span><span class="functiontext">Invocations::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'H'</span><span class="plain">, </span><span class="functiontext">Sentences::Headings::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'h'</span><span class="plain">, </span><span class="functiontext">Phrases::TypeData::Textual::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'I'</span><span class="plain">, </span><span class="functiontext">World::Inferences::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'i'</span><span class="plain">, </span><span class="functiontext">Calculus::Schemas::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'J'</span><span class="plain">, </span><span class="functiontext">NaturalLanguages::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'j'</span><span class="plain">, </span><span class="functiontext">InferenceSubjects::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'K'</span><span class="plain">, </span><span class="functiontext">Rulebooks::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'k'</span><span class="plain">, </span><span class="functiontext">LocalVariables::log</span><span class="plain">);</span>
@ -495,7 +468,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'U'</span><span class="plain">, </span><span class="functiontext">Phrases::Usage::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'u'</span><span class="plain">, </span><span class="identifier">Kinds::Textual::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER_I</span><span class="plain">(</span><span class="character">'V'</span><span class="plain">, </span><span class="functiontext">Sentences::VPs::log</span><span class="plain">)</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'x'</span><span class="plain">, </span><span class="functiontext">Extensions::Files::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'Y'</span><span class="plain">, </span><span class="functiontext">Properties::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'Z'</span><span class="plain">, </span><span class="functiontext">NonlocalVariables::log</span><span class="plain">);</span>
<span class="identifier">REGISTER_WRITER</span><span class="plain">(</span><span class="character">'z'</span><span class="plain">, </span><span class="identifier">Nouns::log</span><span class="plain">);</span>
@ -505,19 +477,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_7"></a><b>&#167;6.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Register this module's command line switches</span> <span class="cwebmacronumber">6.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
@ -550,7 +509,7 @@ we need to use the equivalent of traditional <code class="display"><span class="
<p class="endnote">The function CoreModule::end appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-mr.html">Back to 'Main Routine'</a></li><li><a href="1-kts.html">Continue with 'Kits'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-mr.html">Back to 'Main Routine'</a></li><li><a href="1-pp.html">Continue with 'Progress Percentages'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

423
docs/core-module/1-htc.html Normal file
View file

@ -0,0 +1,423 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/wtc</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 '1/htc' 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#1">Chapter 1: Configuration and Control</a></li><li><b>How To Compile</b></li></ul><p class="purpose">To configure the many locations used in the host filing system.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>We run through the following stages in sequence:
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">STARTED_CSEQ</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">LEXICAL_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">SEMANTIC_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">ASSERTIONS_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">MODEL_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">MODEL_COMPLETE_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">TABLES_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">PHRASES_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">INTER_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">BIBLIOGRAPHIC_CSEQ</span>
<span class="definitionkeyword">enum</span> <span class="constant">FINISHED_CSEQ</span>
</pre>
<pre class="display">
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_compile_tasks_carried_out</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Sequence::carry_out</span><span class="plain">(</span><span class="reserved">compile_task_data</span><span class="plain"> *</span><span class="identifier">ctd</span><span class="plain">) {</span>
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">STARTED_CSEQ</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_compile_tasks_carried_out</span><span class="plain"> == 0) </span>&lt;<span class="cwebmacro">Boot up the compiler</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">start</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Perform lexical analysis</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Perform semantic analysis</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the assertions in two passes</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Make the model world</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Tables and grammar</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Phrases and rules</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Generate inter</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Generate index and bibliographic file</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">;</span>
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">FINISHED_CSEQ</span><span class="plain">);</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">end</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cpu_time_used</span><span class="plain"> = ((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">end</span><span class="plain"> - </span><span class="identifier">start</span><span class="plain">)) / (</span><span class="identifier">CLOCKS_PER_SEC</span><span class="plain">/100);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Compile CPU time: %d centiseconds\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">cpu_time_used</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Sequence::carry_out is used in 1/wtc (<a href="1-wtc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">routine</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) {</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">now</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
<span class="identifier">routine</span><span class="plain">();</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cs</span><span class="plain"> = ((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">clock</span><span class="plain">() - </span><span class="identifier">now</span><span class="plain">)) / (</span><span class="identifier">CLOCKS_PER_SEC</span><span class="plain">/100);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cs</span><span class="plain"> &gt; 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">".... "</span><span class="plain"> #</span><span class="identifier">routine</span><span class="plain"> </span><span class="string">"() took %dcs\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">cs</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="definitionkeyword">define</span> <span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="reserved">plugin</span><span class="plain">, </span><span class="identifier">routine</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">problem_count</span><span class="plain"> == 0) &amp;&amp; (</span><span class="functiontext">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="reserved">plugin</span><span class="plain">))) {</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">now</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
<span class="identifier">routine</span><span class="plain">();</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cs</span><span class="plain"> = ((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">clock</span><span class="plain">() - </span><span class="identifier">now</span><span class="plain">)) / (</span><span class="identifier">CLOCKS_PER_SEC</span><span class="plain">/100);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cs</span><span class="plain"> &gt; 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">".... "</span><span class="plain"> #</span><span class="identifier">routine</span><span class="plain"> </span><span class="string">"() took %dcs\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">cs</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Boot up the compiler</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Emit::begin</span><span class="plain">();</span>
<span class="functiontext">Semantics::read_preform</span><span class="plain">();</span>
<span class="functiontext">Plugins::Manage::start</span><span class="plain">();</span>
<span class="functiontext">InferenceSubjects::begin</span><span class="plain">();</span>
<span class="identifier">Index::DocReferences::read_xrefs</span><span class="plain">();</span>
<span class="identifier">doc_references_top</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain"> - 1;</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="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform lexical analysis</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">LEXICAL_CSEQ</span><span class="plain">);</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(0, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Lexical analysis"</span><span class="plain">);</span>
<span class="functiontext">SourceFiles::read</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()-&gt;</span><span class="identifier">as_copy</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::RuleSubtrees::create_standard_csps</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::RuleSubtrees::create_standard_csps"</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="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform semantic analysis</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">SEMANTIC_CSEQ</span><span class="plain">);</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(1, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Semantic analysis Ia"</span><span class="plain">);</span>
<span class="identifier">Projects::activate_plugins</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">());</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">ParseTreeUsage::plant_parse_tree</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ParseTreeUsage::plant_parse_tree"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">StructuralSentences::break_source</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StructuralSentences::break_source"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Extensions::Inclusion::traverse</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions::Inclusion::traverse"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::satisfy_dependencies</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::Headings::satisfy_dependencies"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Initialise language semantics"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Plugins::Manage::start_plugins</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Plugins::Manage::start_plugins"</span><span class="plain">);</span>
<span class="identifier">Projects::load_types</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">());</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">BinaryPredicates::make_built_in</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"BinaryPredicates::make_built_in"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">NewVerbs::add_inequalities</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"NewVerbs::add_inequalities"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Semantic analysis Ib"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::VPs::traverse</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::VPs::traverse"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::Rearrangement::tidy_up_ofs_and_froms</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::Rearrangement::tidy_up_ofs_and_froms"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::RuleSubtrees::register_recently_lexed_phrases</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::RuleSubtrees::register_recently_lexed_phrases"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">StructuralSentences::declare_source_loaded</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StructuralSentences::declare_source_loaded"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">Kinds::Interpreter::include_templates_for_kinds</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::Interpreter::include_templates_for_kinds"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Semantic analysis II"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">ParseTreeUsage::verify</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ParseTreeUsage::verify"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Extensions::Files::check_versions</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions::Files::check_versions"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::make_tree</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::Headings::make_tree"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::write_as_xml</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::Headings::write_as_xml"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::write_as_xml</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sentences::Headings::write_as_xml"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Modules::traverse_to_define</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Modules::traverse_to_define"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Semantic analysis III"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Adjectives::traverse</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Adjectives::traverse"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Equations::traverse_to_create</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Equations::traverse_to_create"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::traverse_to_create</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::traverse_to_create"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::traverse_for_names</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::traverse_for_names"</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="SP2_4"></a><b>&#167;2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the assertions in two passes</span> <span class="cwebmacronumber">2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">ASSERTIONS_CSEQ</span><span class="plain">);</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(2, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"First pass through assertions"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Assertions::Traverse::traverse</span><span class="plain">(1);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::traverse_to_stock</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::traverse_to_stock"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Second pass through assertions"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Assertions::Traverse::traverse</span><span class="plain">(2);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::kind_declarations</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::kind_declarations"</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="SP2_5"></a><b>&#167;2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make the model world</span> <span class="cwebmacronumber">2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">MODEL_CSEQ</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Making the model world"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">UseOptions::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"UseOptions::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Properties::emit</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Properties::emit"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Properties::Emit::allocate_attributes</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Properties::Emit::allocate_attributes"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Actions::name_all</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::name_all"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">UseNouns::name_all</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"UseNouns::name_all"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Instances::place_objects_in_definition_sequence</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Instances::place_objects_in_definition_sequence"</span><span class="plain">)</span>
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">MODEL_COMPLETE_CSEQ</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">World::complete</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"World::complete"</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="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Tables and grammar</span> <span class="cwebmacronumber">2.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">TABLES_CSEQ</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Tables and grammar"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Properties::Measurement::validate_definitions</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Properties::Measurement::validate_definitions"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">BinaryPredicates::make_built_in_further</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"BinaryPredicates::make_built_in_further"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Bibliographic::IFID::define_UUID</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Bibliographic::IFID::define_UUID"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Figures::compile_ResourceIDsOfFigures_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Figures::compile_ResourceIDsOfFigures_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Sounds::compile_ResourceIDsOfSounds_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Sounds::compile_ResourceIDsOfSounds_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Player::InitialSituation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Player::InitialSituation"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::check_tables_for_kind_clashes</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::check_tables_for_kind_clashes"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::Support::compile_print_table_names</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::Support::compile_print_table_names"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Parsing::traverse</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::traverse"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">World::complete_additions</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"World::complete_additions"</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="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Phrases and rules</span> <span class="cwebmacronumber">2.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">PHRASES_CSEQ</span><span class="plain">);</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(3, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Phrases and rules"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">LiteralPatterns::define_named_phrases</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"LiteralPatterns::define_named_phrases"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::traverse</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::traverse"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::register_meanings</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::register_meanings"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::parse_rule_parameters</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::parse_rule_parameters"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::add_rules_to_rulebooks</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::add_rules_to_rulebooks"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::parse_rule_placements</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::parse_rule_placements"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Equations::traverse_to_stock</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Equations::traverse_to_stock"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::traverse_to_stock</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::traverse_to_stock"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Properties::annotate_attributes</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Properties::annotate_attributes"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Rulebooks::Outcomes::RulebookOutcomePrintingRule</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rulebooks::Outcomes::RulebookOutcomePrintingRule"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::compile_instance_counts</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::compile_instance_counts"</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="SP2_8"></a><b>&#167;2.8. </b>This is where we hand over to regular template files &mdash; containing code
passed through as I6 source, as well as a few further commands &mdash; starting
with "Output.i6t".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Generate inter</span> <span class="cwebmacronumber">2.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">INTER_CSEQ</span><span class="plain">);</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(4, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Generating inter"</span><span class="plain">);</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">UseOptions::compile_icl_commands</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"UseOptions::compile_icl_commands"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">FundamentalConstants::emit_build_number</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"FundamentalConstants::emit_build_number"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Bibliographic::compile_constants</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Bibliographic::compile_constants"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Extensions::Files::ShowExtensionVersions_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions::Files::ShowExtensionVersions_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">Kinds::Constructors::compile_I6_constants</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::Constructors::compile_I6_constants"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">scoring_plugin</span><span class="plain">, </span><span class="identifier">PL::Score::compile_max_score</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Score::compile_max_score"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">UseOptions::TestUseOption_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"UseOptions::TestUseOption_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::compile_activity_constants</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::compile_activity_constants"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::Activity_before_rulebooks_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::Activity_before_rulebooks_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::Activity_for_rulebooks_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::Activity_for_rulebooks_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::Activity_after_rulebooks_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::Activity_after_rulebooks_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::Activity_atb_rulebooks_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::Activity_atb_rulebooks_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Relations::compile_defined_relation_constants</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Relations::compile_defined_relation_constants"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::compile_data_type_support_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::compile_data_type_support_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::I7_Kind_Name_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::I7_Kind_Name_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">World::Compile::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"World::Compile::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">backdrops_plugin</span><span class="plain">, </span><span class="identifier">PL::Backdrops::write_found_in_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Backdrops::write_found_in_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">map_plugin</span><span class="plain">, </span><span class="identifier">PL::Map::write_door_dir_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Map::write_door_dir_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">map_plugin</span><span class="plain">, </span><span class="identifier">PL::Map::write_door_to_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Map::write_door_to_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::General::write_parse_name_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::General::write_parse_name_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">regions_plugin</span><span class="plain">, </span><span class="identifier">PL::Regions::write_regional_found_in_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Regions::write_regional_found_in_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::complete</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::complete"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Tables::Support::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tables::Support::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Equations::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Equations::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="identifier">PL::Actions::Patterns::Named::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::Patterns::Named::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="identifier">PL::Actions::ActionData</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::ActionData"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="identifier">PL::Actions::ActionCoding_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::ActionCoding_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="identifier">PL::Actions::ActionHappened</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::ActionHappened"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="identifier">PL::Actions::compile_action_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Actions::compile_action_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Lines::MistakeActionSub_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Lines::MistakeActionSub_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::compile_first_block</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::compile_first_block"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::compile_rulebooks</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::compile_rulebooks"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::rulebooks_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::rulebooks_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">scenes_plugin</span><span class="plain">, </span><span class="identifier">PL::Scenes::DetectSceneChange_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Scenes::DetectSceneChange_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">scenes_plugin</span><span class="plain">, </span><span class="identifier">PL::Scenes::ShowSceneStatus_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Scenes::ShowSceneStatus_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Files::arrays</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Files::arrays"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Rulebooks::rulebook_var_creators</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rulebooks::rulebook_var_creators"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Activities::activity_var_creators</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Activities::activity_var_creators"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Relations::IterateRelations</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Relations::IterateRelations"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::RulebookNames_array</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::RulebookNames_array"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::RulePrintingRule_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::RulePrintingRule_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Verbs::prepare</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Verbs::prepare"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Verbs::compile_conditions</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Verbs::compile_conditions"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Values::number</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Values::number"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Values::truth_state</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Values::truth_state"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Values::time</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Values::time"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Values::compile_type_gprs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Values::compile_type_gprs"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">NewVerbs::ConjugateVerb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"NewVerbs::ConjugateVerb"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Adjectives::Meanings::agreements</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Adjectives::Meanings::agreements"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">())) {</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="functiontext">PL::Parsing::TestScripts::write_text</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::TestScripts::write_text"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::TestScripts::TestScriptSub_routine"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="functiontext">PL::Parsing::TestScripts::InternalTestCases_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::TestScripts::InternalTestCases_routine"</span><span class="plain">)</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_stub_routine</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::TestScripts::TestScriptSub_stub_routine"</span><span class="plain">)</span>
<span class="plain">}</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::check</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::check"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::compile"</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Projects::Main_defined</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::invoke_to_begin</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::invoke_to_begin"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::compile_as_needed</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::compile_as_needed"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Strings::compile_responses</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Strings::compile_responses"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::check</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::check"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Relations::compile_defined_relations</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Relations::compile_defined_relations"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Manager::compile_as_needed</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Manager::compile_as_needed"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Strings::TextSubstitutions::allow_no_further_text_subs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Strings::TextSubstitutions::allow_no_further_text_subs"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Filters::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Filters::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">, </span><span class="functiontext">Chronology::past_actions_i6_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chronology::past_actions_i6_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">chronology_plugin</span><span class="plain">, </span><span class="functiontext">Chronology::chronology_extents_i6_escape</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chronology::chronology_extents_i6_escape"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">chronology_plugin</span><span class="plain">, </span><span class="functiontext">Chronology::past_tenses_i6_escape</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chronology::past_tenses_i6_escape"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">chronology_plugin</span><span class="plain">, </span><span class="functiontext">Chronology::allow_no_further_past_tenses</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chronology::allow_no_further_past_tenses"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Verbs::compile_all</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Verbs::compile_all"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP_IF</span><span class="plain">(</span><span class="identifier">parsing_plugin</span><span class="plain">, </span><span class="identifier">PL::Parsing::Tokens::Filters::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Parsing::Tokens::Filters::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Properties::Measurement::compile_MADJ_routines</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Properties::Measurement::compile_MADJ_routines"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Calculus::Propositions::Deferred::compile_remaining_deferred</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Calculus::Propositions::Deferred::compile_remaining_deferred"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Calculus::Deferrals::allow_no_further_deferrals</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Calculus::Deferrals::allow_no_further_deferrals"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::check</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::check"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Lists::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lists::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Strings::TextLiterals::compile</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Strings::TextLiterals::compile"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">JumpLabels::compile_necessary_storage</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"JumpLabels::compile_necessary_storage"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::compile_heap_allocator</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::compile_heap_allocator"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Constants::compile_closures</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Constants::compile_closures"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Kinds::RunTime::compile_structures</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kinds::RunTime::compile_structures"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Rules::check_response_usages</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rules::check_response_usages"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Timed::check_for_unused</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Timed::check_for_unused"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Showme::compile_SHOWME_details</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Showme::compile_SHOWME_details"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Timed::TimedEventsTable</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Timed::TimedEventsTable"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">Phrases::Timed::TimedEventTimesTable</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phrases::Timed::TimedEventTimesTable"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="identifier">PL::Naming::compile_cap_short_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"PL::Naming::compile_cap_short_name"</span><span class="plain">)</span>
<span class="identifier">COMPILATION_STEP</span><span class="plain">(</span><span class="functiontext">UseOptions::configure_template</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"UseOptions::configure_template"</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="SP2_9"></a><b>&#167;2.9. </b>Metadata.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Generate index and bibliographic file</span> <span class="cwebmacronumber">2.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="constant">BIBLIOGRAPHIC_CSEQ</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="identifier">bibliographic_plugin</span><span class="plain">))</span>
<span class="identifier">PL::Bibliographic::Release::write_ifiction_and_blurb</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0)</span>
<span class="functiontext">NaturalLanguages::produce_index</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. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_log_phases</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sequence::go_to_log_phase</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">argument</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">phase_names</span><span class="plain">[] = {</span>
<span class="string">"I"</span><span class="plain">, </span><span class="string">"II"</span><span class="plain">, </span><span class="string">"III"</span><span class="plain">, </span><span class="string">"IV"</span><span class="plain">, </span><span class="string">"V"</span><span class="plain">, </span><span class="string">"VI"</span><span class="plain">, </span><span class="string">"VII"</span><span class="plain">, </span><span class="string">"VIII"</span><span class="plain">, </span><span class="string">"IX"</span><span class="plain">, </span><span class="string">"X"</span><span class="plain">,</span>
<span class="string">"XI"</span><span class="plain">, </span><span class="string">"XII"</span><span class="plain">, </span><span class="string">"XIII"</span><span class="plain">, </span><span class="string">"XIV"</span><span class="plain">, </span><span class="string">"XV"</span><span class="plain">, </span><span class="string">"XVI"</span><span class="plain">, </span><span class="string">"XVII"</span><span class="plain">, </span><span class="string">"XVIII"</span><span class="plain">, </span><span class="string">"XIX"</span><span class="plain">, </span><span class="string">"XX"</span><span class="plain">, </span><span class="string">"XXI"</span><span class="plain">, </span><span class="string">"XXII"</span><span class="plain"> };</span>
<span class="identifier">Log::new_phase</span><span class="plain">(</span><span class="identifier">phase_names</span><span class="plain">[</span><span class="identifier">no_log_phases</span><span class="plain">], </span><span class="identifier">argument</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_log_phases</span><span class="plain"> &lt; 21) </span><span class="identifier">no_log_phases</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Sequence::go_to_log_phase is used in <a href="#SP2_2">&#167;2.2</a>, <a href="#SP2_3">&#167;2.3</a>, <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_5">&#167;2.5</a>, <a href="#SP2_6">&#167;2.6</a>, <a href="#SP2_7">&#167;2.7</a>, <a href="#SP2_8">&#167;2.8</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-wtc.html">Back to 'What To Compile'</a></li><li><i>(This section ends Chapter 1: Configuration and Control.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/kts</title>
<title>1/cm</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">
@ -64,7 +64,7 @@ progress bar with a rubric beneath it.
<p class="inwebparagraph"></p>
<p class="endnote">The function ProgressBar::update_progress_bar is used in 1/mr (<a href="1-mr.html#SP4_9">&#167;4.9</a>, <a href="1-mr.html#SP4_10">&#167;4.10</a>, <a href="1-mr.html#SP4_11">&#167;4.11</a>, <a href="1-mr.html#SP4_14">&#167;4.14</a>, <a href="1-mr.html#SP4_15">&#167;4.15</a>), 22/cs (<a href="22-cs.html#SP4">&#167;4</a>), 22/ph (<a href="22-ph.html#SP12_1">&#167;12.1</a>).</p>
<p class="endnote">The function ProgressBar::update_progress_bar is used in 1/htc (<a href="1-htc.html#SP2_2">&#167;2.2</a>, <a href="1-htc.html#SP2_3">&#167;2.3</a>, <a href="1-htc.html#SP2_4">&#167;2.4</a>, <a href="1-htc.html#SP2_7">&#167;2.7</a>, <a href="1-htc.html#SP2_8">&#167;2.8</a>), 22/cs (<a href="22-cs.html#SP4">&#167;4</a>), 22/ph (<a href="22-ph.html#SP12_1">&#167;12.1</a>).</p>
<p class="endnote">The function ProgressBar::final_state_of_progress_bar is used in 2/up (<a href="2-up.html#SP2_3">&#167;2.3</a>).</p>
@ -94,7 +94,7 @@ a final status indicator.
<p class="endnote">The function ProgressBar::end_outcome is used in 2/up (<a href="2-up.html#SP2_2">&#167;2.2</a>, <a href="2-up.html#SP2_3">&#167;2.3</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-kts.html">Back to 'Kits'</a></li><li><a href="1-wel.html">Continue with 'Where Everything Lives'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-cm.html">Back to 'Core Module'</a></li><li><a href="1-wtc.html">Continue with 'What To Compile'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

517
docs/core-module/1-wtc.html Normal file
View file

@ -0,0 +1,517 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/pp</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 '1/wtc' 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#1">Chapter 1: Configuration and Control</a></li><li><b>What To Compile</b></li></ul><p class="purpose">To receive an instruction to compile something from Inbuild, and then to sort out the many locations then used in the host filing system.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Task data</a></li><li><a href="#SP7">&#167;7. Project-related files and file paths</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Task data. </b>When Inbuild (a copy of which is included in the Inform 7 executable) decides
that an Inform source text must be compiled, it calls <code class="display"><span class="extract">Task::carry_out</span></code>. By
this point Inbuild will have set up an <code class="display"><span class="extract">inform_project</span></code> structure to
represent the program we have to compile; but we will need additional data
about that compilation, and it's stored in the following.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">compile_task_data</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">build_step</span><span class="plain"> *</span><span class="identifier">task</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">materials</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">existing_storyfile</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage_of_compilation</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_resource_number</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">compile_task_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure compile_task_data is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>An early and perhaps arguable design decision for inform7 was that it would
compile just one source text in its lifetime as a process: and because of that,
<code class="display"><span class="extract">Task::carry_out</span></code> can only in fact be called once, and Inbuild only does so
once. But the following routine allows in principle for multiple calls,
against the day when we change our minds about all this.
</p>
<p class="inwebparagraph">Something we will never do is attempt to make <code class="display"><span class="extract">inform7</span></code> thread-safe in the
sense of being able to compile two source texts simultaneously. The global
<code class="display"><span class="extract">inform7_task</span></code> is null when nothing is being compiled, or set to the unique
thing which is being compiled when it is.
</p>
<pre class="display">
<span class="reserved">compile_task_data</span><span class="plain"> *</span><span class="identifier">inform7_task</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::carry_out</span><span class="plain">(</span><span class="identifier">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</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">"no project"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"cannot re-enter with new task"</span><span class="plain">);</span>
<span class="identifier">inform7_task</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">compile_task_data</span><span class="plain">);</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;task</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">-&gt;</span><span class="identifier">location_if_path</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain"> = </span><span class="identifier">Projects::build_pathname</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain"> = </span><span class="identifier">Inbuild::materials</span><span class="plain">();</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> = -1;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;next_resource_number</span><span class="plain"> = 3;</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">NaturalLanguages::English</span><span class="plain">();</span>
<span class="identifier">Projects::set_language_of_syntax</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">Projects::set_language_of_index</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">Projects::set_language_of_play</span><span class="plain">(</span><span class="identifier">project</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">rv</span><span class="plain"> = </span><span class="functiontext">Sequence::carry_out</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">);</span>
<span class="identifier">inform7_task</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">rv</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::carry_out appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We will keep track of how far along the process has advanced, in very
rough terms.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> &lt;= </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"not an advance"</span><span class="plain">);</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> = </span><span class="identifier">stage</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_before_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> &lt; </span><span class="identifier">stage</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_during_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> == </span><span class="identifier">stage</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_after_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> &gt; </span><span class="identifier">stage</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::advance_stage_to is used in 1/htc (<a href="1-htc.html#SP2">&#167;2</a>, <a href="1-htc.html#SP2_2">&#167;2.2</a>, <a href="1-htc.html#SP2_3">&#167;2.3</a>, <a href="1-htc.html#SP2_4">&#167;2.4</a>, <a href="1-htc.html#SP2_5">&#167;2.5</a>, <a href="1-htc.html#SP2_6">&#167;2.6</a>, <a href="1-htc.html#SP2_7">&#167;2.7</a>, <a href="1-htc.html#SP2_8">&#167;2.8</a>, <a href="1-htc.html#SP2_9">&#167;2.9</a>).</p>
<p class="endnote">The function Task::is_before_stage appears nowhere else.</p>
<p class="endnote">The function Task::is_during_stage is used in 16/in (<a href="16-in.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Task::is_after_stage appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The current project and the virtual machine we want to compile it for:
</p>
<pre class="display">
<span class="identifier">inform_project</span><span class="plain"> *</span><span class="functiontext">Task::project</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">target_vm</span><span class="plain"> *</span><span class="functiontext">Task::vm</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;task</span><span class="plain">-&gt;</span><span class="identifier">for_vm</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::project is used in 1/htc (<a href="1-htc.html#SP2_2">&#167;2.2</a>, <a href="1-htc.html#SP2_3">&#167;2.3</a>, <a href="1-htc.html#SP2_8">&#167;2.8</a>), 3/nl (<a href="3-nl.html#SP3">&#167;3</a>), 4/its (<a href="4-its.html#SP7">&#167;7</a>), 4/am (<a href="4-am.html#SP42">&#167;42</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/ins (<a href="5-ins.html#SP14">&#167;14</a>, <a href="5-ins.html#SP25">&#167;25</a>, <a href="5-ins.html#SP26">&#167;26</a>), 5/ipw (<a href="5-ipw.html#SP3_3_1">&#167;3.3.1</a>, <a href="5-ipw.html#SP3_3_1_1">&#167;3.3.1.1</a>), 6/nv (<a href="6-nv.html#SP22">&#167;22</a>), 26/ts (<a href="26-ts.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Task::vm is used in <a href="#SP14">&#167;14</a>, 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>), 5/lp (<a href="5-lp.html#SP12_2">&#167;12.2</a>, <a href="5-lp.html#SP18_3">&#167;18.3</a>), 6/rlt (<a href="6-rlt.html#SP14">&#167;14</a>), 7/hdn (<a href="7-hdn.html#SP12">&#167;12</a>), 8/ie (<a href="8-ie.html#SP9_1">&#167;9.1</a>), 13/rsfk (<a href="13-rsfk.html#SP18_1">&#167;18.1</a>, <a href="13-rsfk.html#SP20">&#167;20</a>, <a href="13-rsfk.html#SP26">&#167;26</a>), 17/ts (<a href="17-ts.html#SP11_1">&#167;11.1</a>), 25/cii (<a href="25-cii.html#SP3_5_8_3">&#167;3.5.8.3</a>), 26/fc (<a href="26-fc.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP18">&#167;18</a>), 26/rt (<a href="26-rt.html#SP4">&#167;4</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Resources in a Blorb file have unique ID numbers which are positive integers,
but these are not required to start from 1, nor to be contiguous. For Inform,
ID number 1 is reserved for the cover image (whether or not any cover image
is provided: it is legal for there to be figures but no cover, and vice versa).
Other figures, and sound effects, then mix freely as needed from ID number 3
on upwards. We skip 2 so that it can be guaranteed that no sound resource
has ID 1 or 2: this is to help people trying to play sounds in the Z-machine,
where operand 1 or 2 in the <code class="display"><span class="extract">@sound</span></code> opcode signifies not a sound resource
number but a long or short beep. If a genuine sound effect had resource ID
1 or 2, therefore, it would be unplayable on the Z-machine.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::get_next_free_blorb_resource_ID</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;next_resource_number</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::get_next_free_blorb_resource_ID appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>This seed is ordinarily 0, causing no fix to occur, but can be set to
a non-zero value to make testing Inform easier.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::rng_seed</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">fix_rng</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::rng_seed is used in 9/ma (<a href="9-ma.html#SP3_3_41_2_2_1">&#167;3.3.41.2.2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP24">&#167;24</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Project-related files and file paths. </b>An Inform compilation can touch dozens of different files, and the rest
of this section is a tour through the ones which are associated with the
project itself. (Common resources, used for all compilations, or optional
add-ins such as extensions are the business of Inbuild.)
</p>
<p class="inwebparagraph">If a project is called, say, Wuthering Heights, and is a "bundle" as created
and compiled by the Inform app, then:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) The project path will be <code class="display"><span class="extract">Wuthering Heights.inform</span></code>. This looks opaque
on MacOS, as if a file, but on all platforms it is in fact a directory.
</li><li>(b) Within it is <code class="display"><span class="extract">Wuthering Heights.inform/Build</span></code>, the "build folder".
</li><li>(c) Alongside it is <code class="display"><span class="extract">Wuthering Heights.materials</span></code>. This is also a directory,
but is openly accessible even on MacOS.
</li></ul>
<p class="inwebparagraph">If Inform is working on a single source text file, not a bundle, then the
project will be the current working directory, but now the build folder will
be the Inbuild transient area, and materials (if present) will again be
alongside.
</p>
<p class="inwebparagraph">To begin: what's in the project area? <code class="display"><span class="extract">story.ni</span></code> and <code class="display"><span class="extract">auto.inf</span></code>, neither
one very helpfully named, are defined in Inbuild rather than here: these
are the I7 source text and its compilation down to I6, respectively.
In addition we have:
</p>
<p class="inwebparagraph">The UUID file records an ISBN-like identifying number for the project. This
is read-only for us.
</p>
<p class="inwebparagraph">The iFiction record, manifest and blurb file are all files that we generate
to give instructions to the releasing agent Inblorb. This means that they
have no purpose unless Inform is in a release run (with <code class="display"><span class="extract">-release</span></code> set on
the command line), but they take no time to generate so we make them anyway.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::uuid_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"uuid.txt"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::ifiction_record_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Metadata.iFiction"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::manifest_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"manifest.plist"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::blurb_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::uuid_file appears nowhere else.</p>
<p class="endnote">The function Task::ifiction_record_file appears nowhere else.</p>
<p class="endnote">The function Task::manifest_file appears nowhere else.</p>
<p class="endnote">The function Task::blurb_file appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The build folder for a project contains all of the working files created
during the compilation process. The debugging log and Inform problems report
(its HTML file of error messages) are both written there: see the Main Routine
section for details. In addition we have:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::cblorb_report_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StatusCblorb.html"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::parse_tree_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Parse tree.txt"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::cblorb_report_file appears nowhere else.</p>
<p class="endnote">The function Task::parse_tree_file is used in 7/ptu (<a href="7-ptu.html#SP18">&#167;18</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>The name of the unblorbed story file is chosen for us by Inbuild, so
we have to extract it from the build graph:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::storyfile_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">unblorbed_vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</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">"project graph not ready"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_internal_file</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::storyfile_file appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Deeper inside the<code class="display"><span class="extract">Build</span></code> subfolder is an (also ephemeral) <code class="display"><span class="extract">Index</span></code> subfolder,
which holds the mini-website of the Index for a project.
</p>
<p class="inwebparagraph">The main index files (<code class="display"><span class="extract">Phrasebook.html</span></code> and so on) live at the top level,
details on actions live in the subfolder <code class="display"><span class="extract">Details</span></code>: see below.
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::index_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Index"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::index_path is used in <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>An oddity in the Index folder is an XML file recording where the headings
are in the source text: this is for the benefit of the user interface
application, if it wants it, but is not linked to or used by the HTML of
the index as seen by the user.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::xml_headings_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Task::index_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Headings.xml"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::xml_headings_file is used in 7/hdn (<a href="7-hdn.html#SP35">&#167;35</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>Within the Index is a deeper level, into the weeds as it were, called
<code class="display"><span class="extract">Details</span></code>.
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::index_details_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::index_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Details"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::index_details_path is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>And the following routine determines the filename for a page in this
mini-website. Filenames down in the <code class="display"><span class="extract">Details</span></code> area have the form
<code class="display"><span class="extract">N_S</span></code> where <code class="display"><span class="extract">N</span></code> is an integer supplied and <code class="display"><span class="extract">S</span></code> the leafname; for instance,
<code class="display"><span class="extract">21_A.html</span></code> provides details page number 21 about actions, derived from the
leafname <code class="display"><span class="extract">A.html</span></code>.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::index_file</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sub</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sub</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">, </span><span class="string">"%d_%S"</span><span class="plain">, </span><span class="identifier">sub</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Task::index_details_path</span><span class="plain">(), </span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Task::index_path</span><span class="plain">(), </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::index_file appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>That's it for the project folder, but other project-related stuff is in
the materials folder, which we turn to next.
</p>
<p class="inwebparagraph">Inform is occasionally run in a mode where it performs a release on an
existing story file (for example a 1980s Infocom one) rather than on one
that it has newly generated. This is the filename such a story file would
have by default, if so.
</p>
<p class="inwebparagraph">By default the story file will be called something like <code class="display"><span class="extract">story.z8</span></code>, but
its leafname is actually declared from the source text of the Inform
project created to do this wrapping-up. So we need a way to set as well
as read this filename. Whatever the leafname, though, it lives in the top
level of materuals.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)?</span><span class="identifier">TRUE</span><span class="plain">:</span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::set_existing_storyfile</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"story.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_unblorbed_extension</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()));</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::existing_storyfile_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::wraps_existing_storyfile is used in 5/ipw (<a href="5-ipw.html#SP2">&#167;2</a>), 13/rsfk (<a href="13-rsfk.html#SP5">&#167;5</a>), 17/tl (<a href="17-tl.html#SP14_1">&#167;14.1</a>).</p>
<p class="endnote">The function Task::set_existing_storyfile appears nowhere else.</p>
<p class="endnote">The function Task::existing_storyfile_file appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>Materials is also where cover art lives: it could have either the file
extension <code class="display"><span class="extract">.jpg</span></code> or <code class="display"><span class="extract">.png</span></code>, and we generate both sets of filenames, even
though at most one will actually work. This is also where we generate the EPS
file of the map, if so requested; a bit anomalously, it's the only file in
Materials but outside Release which we write to.
</p>
<p class="inwebparagraph">This is also where the originals (not the released copies) of the Figures
and Sounds, if any, live: in their own subfolders.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::large_cover_art_file</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">JPEG</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">JPEG</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.jpg"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.png"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::epsmap_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Inform Map.eps"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::figures_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::sounds_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::large_cover_art_file appears nowhere else.</p>
<p class="endnote">The function Task::epsmap_file appears nowhere else.</p>
<p class="endnote">The function Task::figures_path appears nowhere else.</p>
<p class="endnote">The function Task::sounds_path appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>On a release run, Inblorb will populate the Release subfolder of Materials;
figures and sounds will be copied into the relevant subfolders. The principle
is that everything in Release can always be thrown away without loss, because
it can all be generated again.
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::release_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</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">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_figures_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_sounds_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_interpreter_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"interpreter"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::release_path appears nowhere else.</p>
<p class="endnote">The function Task::released_figures_path appears nowhere else.</p>
<p class="endnote">The function Task::released_sounds_path appears nowhere else.</p>
<p class="endnote">The function Task::released_interpreter_path appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-pp.html">Back to 'Progress Percentages'</a></li><li><a href="1-htc.html">Continue with 'How To Compile'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -49,7 +49,7 @@ a <code class="display"><span class="extract">pcalc_prop</span></code> structure
<p class="inwebparagraph"></p>
<p class="endnote">The structure pcalc_prop is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/pr, 11/bas, 11/tc, 11/sc, 11/sm, 11/tcp, 12/ap, 12/ca, 12/dtd, 12/cad, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure pcalc_prop is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/pr, 11/bas, 11/tc, 11/sc, 11/sm, 11/tcp, 12/ap, 12/ca, 12/dtd, 12/cad, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The Universe is filled with atoms, but they come in different kinds, called
elements. For us, an "element" is the identifying number, stored in the

View file

@ -57,7 +57,7 @@ their existence.
<p class="endnote">The function Calculus::Propositions::Abstract::to_make_a_const is used in 9/tc (<a href="9-tc.html#SP5_4_2_2">&#167;5.4.2.2</a>).</p>
<p class="endnote">The function Calculus::Propositions::Abstract::to_create_something is used in 3/nl (<a href="3-nl.html#SP14">&#167;14</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP5_4_2_1">&#167;5.4.2.1</a>, <a href="9-tc.html#SP5_4_2_2">&#167;5.4.2.2</a>, <a href="9-tc.html#SP5_4_2_3">&#167;5.4.2.3</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/pd (<a href="9-pd.html#SP5_11">&#167;5.11</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Calculus::Propositions::Abstract::to_create_something is used in 3/nl (<a href="3-nl.html#SP6">&#167;6</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP5_4_2_1">&#167;5.4.2.1</a>, <a href="9-tc.html#SP5_4_2_2">&#167;5.4.2.2</a>, <a href="9-tc.html#SP5_4_2_3">&#167;5.4.2.3</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/pd (<a href="9-pd.html#SP5_11">&#167;5.11</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>A proposition to assert that an object has a given kind:
</p>

View file

@ -127,7 +127,7 @@ we don't accidentally break this rule:
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Propositions::Assert::assert_true is used in 3/nl (<a href="3-nl.html#SP14">&#167;14</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP5_4_2_1">&#167;5.4.2.1</a>, <a href="9-tc.html#SP5_4_2_2">&#167;5.4.2.2</a>, <a href="9-tc.html#SP5_4_2_3">&#167;5.4.2.3</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/pk (<a href="9-pk.html#SP2">&#167;2</a>), 9/rk (<a href="9-rk.html#SP3">&#167;3</a>), 9/pd (<a href="9-pd.html#SP5_11">&#167;5.11</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Calculus::Propositions::Assert::assert_true is used in 3/nl (<a href="3-nl.html#SP6">&#167;6</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP5_4_2_1">&#167;5.4.2.1</a>, <a href="9-tc.html#SP5_4_2_2">&#167;5.4.2.2</a>, <a href="9-tc.html#SP5_4_2_3">&#167;5.4.2.3</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/pk (<a href="9-pk.html#SP2">&#167;2</a>), 9/rk (<a href="9-rk.html#SP3">&#167;3</a>), 9/pd (<a href="9-pd.html#SP5_11">&#167;5.11</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Calculus::Propositions::Assert::assert_true_about is used in 6/rlt (<a href="6-rlt.html#SP9">&#167;9</a>), 9/ma (<a href="9-ma.html#SP3_3_39_5">&#167;3.3.39.5</a>), 9/pk (<a href="9-pk.html#SP3">&#167;3</a>), 9/rk (<a href="9-rk.html#SP1_2">&#167;1.2</a>), 9/imp (<a href="9-imp.html#SP7_1_3">&#167;7.1.3</a>), 9/pd (<a href="9-pd.html#SP5_9">&#167;5.9</a>, <a href="9-pd.html#SP5_10">&#167;5.10</a>, <a href="9-pd.html#SP6_1">&#167;6.1</a>), 11/tc (<a href="11-tc.html#SP2">&#167;2</a>), 15/ep (<a href="15-ep.html#SP9">&#167;9</a>), 15/vp (<a href="15-vp.html#SP10">&#167;10</a>), 19/tod (<a href="19-tod.html#SP6_4">&#167;6.4</a>).</p>

View file

@ -79,7 +79,7 @@ which create routines which... and so on.
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Propositions::Deferred::compile_remaining_deferred is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Calculus::Propositions::Deferred::compile_remaining_deferred is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Calculus::Propositions::Deferred::compilation_coroutine is used in 22/cs (<a href="22-cs.html#SP14">&#167;14</a>).</p>

View file

@ -68,7 +68,7 @@ all deferral requests are redeemed &mdash; they would then never be reached.
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Deferrals::allow_no_further_deferrals is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Calculus::Deferrals::allow_no_further_deferrals is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Deferral requests. </b>The following fills out the paperwork to request a deferred proposition.
</p>

View file

@ -303,7 +303,7 @@ absence of rooms would otherwise result in.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</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">existing_story_file</span><span class="plain">) { *</span><span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; *</span><span class="identifier">v2</span><span class="plain"> = 0; </span><span class="reserved">return</span><span class="plain">; } </span> <span class="comment">see above</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">()) { *</span><span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; *</span><span class="identifier">v2</span><span class="plain"> = 0; </span><span class="reserved">return</span><span class="plain">; } </span> <span class="comment">see above</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
@ -855,7 +855,7 @@ K, we have also seen its bases.
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::compile_structures is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_structures is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP16_1"></a><b>&#167;16.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile the runtime ID structure for this kind</span> <span class="cwebmacronumber">16.1</span>&gt; =
@ -1057,7 +1057,7 @@ property values, table entries, list items) of pointer-value kinds:
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::compile_heap_allocator is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_heap_allocator is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP18_1"></a><b>&#167;18.1. </b>By now, we know that we need at least <code class="display"><span class="extract">total_heap_allocation</span></code> bytes on the
heap, but the initial heap size has to be a power of 2, so we compute the
@ -1080,7 +1080,7 @@ has essentially no memory constraints compared with the Z-machine.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">total_heap_allocation</span><span class="plain"> &lt; </span><span class="functiontext">UseOptions::get_dynamic_memory_allocation</span><span class="plain">())</span>
<span class="identifier">total_heap_allocation</span><span class="plain"> = </span><span class="functiontext">UseOptions::get_dynamic_memory_allocation</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">max_heap</span><span class="plain"> &lt; </span><span class="identifier">total_heap_allocation</span><span class="plain">) </span><span class="identifier">max_heap</span><span class="plain"> = </span><span class="identifier">max_heap</span><span class="plain">*2;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">())</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()))</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">MEMORY_HEAP_SIZE_HL</span><span class="plain">), </span><span class="identifier">max_heap</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">MEMORY_HEAP_SIZE_HL</span><span class="plain">), 4*</span><span class="identifier">max_heap</span><span class="plain">);</span>
@ -1169,12 +1169,12 @@ list of 20 texts. For the cases above, it's always 1.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::RunTime::emit_block_value_header</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="reserved">int</span><span class="plain"> </span><span class="identifier">individual</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">size</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">individual</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0, </span><span class="identifier">c</span><span class="plain"> = 1, </span><span class="identifier">w</span><span class="plain"> = 4;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">()) </span><span class="identifier">w</span><span class="plain"> = 2;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">())) </span><span class="identifier">w</span><span class="plain"> = 2;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; (</span><span class="identifier">size</span><span class="plain"> + 3)*</span><span class="identifier">w</span><span class="plain">) { </span><span class="identifier">n</span><span class="plain">++; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">*2; }</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">flags</span><span class="plain"> = </span><span class="constant">BLK_FLAG_RESIDENT</span><span class="plain"> + </span><span class="constant">BLK_FLAG_WORD</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_list_of</span><span class="plain">) </span><span class="identifier">flags</span><span class="plain"> += </span><span class="constant">BLK_FLAG_TRUNCMULT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_relation</span><span class="plain">) </span><span class="identifier">flags</span><span class="plain"> += </span><span class="constant">BLK_FLAG_MULTIPLE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">())</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()))</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) (0</span><span class="identifier">x100</span><span class="plain">*</span><span class="identifier">n</span><span class="plain"> + </span><span class="identifier">flags</span><span class="plain">));</span>
<span class="reserved">else</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) (0</span><span class="identifier">x1000000</span><span class="plain">*</span><span class="identifier">n</span><span class="plain"> + 0</span><span class="identifier">x10000</span><span class="plain">*</span><span class="identifier">flags</span><span class="plain">));</span>
@ -1490,7 +1490,7 @@ each such kind, and needed at run-time.
<span class="plain">#</span><span class="identifier">endif</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">CCOUNT_QUOTATIONS_HL</span><span class="plain">), </span><span class="functiontext">Strings::TextLiterals::CCOUNT_QUOTATIONS</span><span class="plain">());</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">MAX_FRAME_SIZE_NEEDED_HL</span><span class="plain">), </span><span class="identifier">max_frame_size_needed</span><span class="plain">);</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RNG_SEED_AT_START_OF_PLAY_HL</span><span class="plain">), </span><span class="identifier">rng_seed_at_start_of_play</span><span class="plain">);</span>
<span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RNG_SEED_AT_START_OF_PLAY_HL</span><span class="plain">), </span><span class="functiontext">Task::rng_seed</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::RunTime::compile_data_type_support_routines</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -1528,13 +1528,13 @@ each such kind, and needed at run-time.
<p class="endnote">The function Kinds::RunTime::emit appears nowhere else.</p>
<p class="endnote">The function Kinds::RunTime::kind_declarations is used in 1/mr (<a href="1-mr.html#SP4_11">&#167;4.11</a>).</p>
<p class="endnote">The function Kinds::RunTime::kind_declarations is used in 1/htc (<a href="1-htc.html#SP2_4">&#167;2.4</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_nnci is used in <a href="#SP18_1">&#167;18.1</a>.</p>
<p class="endnote">The function Kinds::RunTime::compile_instance_counts is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_instance_counts is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_data_type_support_routines is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Kinds::RunTime::compile_data_type_support_routines is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b>A slightly bogus case first. If the source text declares a kind but never
gives any enumerated values or literal patterns, then such values will never
@ -2409,7 +2409,7 @@ Z-machine array space.
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::I7_Kind_Name_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Kinds::RunTime::I7_Kind_Name_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>
@ -2417,7 +2417,7 @@ Z-machine array space.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">VM_non_support_problem_issued</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">Kinds::RunTime::notify_of_use</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="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::supports</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="reserved">if</span><span class="plain"> (</span><span class="functiontext">Kinds::RunTime::target_VM_supports</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="reserved">if</span><span class="plain"> (</span><span class="identifier">VM_non_support_problem_issued</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">VM_non_support_problem_issued</span><span class="plain"> = </span><span class="identifier">TRUE</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">PM_KindRequiresGlulx</span><span class="plain">));</span>
@ -2432,12 +2432,22 @@ Z-machine array space.
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::RunTime::target_VM_supports</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="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">VM</span><span class="plain"> = </span><span class="functiontext">Task::vm</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VM</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">"target VM not set yet"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">TargetVMs::supports_floating_point</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::notify_of_use is used in 14/cfs (<a href="14-cfs.html#SP7">&#167;7</a>, <a href="14-cfs.html#SP8">&#167;8</a>, <a href="14-cfs.html#SP9">&#167;9</a>), 20/eq (<a href="20-eq.html#SP50_3_1">&#167;50.3.1</a>).</p>
<p class="endnote">The function Kinds::RunTime::target_VM_supports is used in 20/eq (<a href="20-eq.html#SP41">&#167;41</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="13-ca.html">Back to 'Compile Arithmetic'</a></li><li><a href="13-ki.html">Continue with 'Kinds Index'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -47,8 +47,6 @@ manage that here.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K2</span><span class="plain">) </span><span class="identifier">nw</span><span class="plain"> += </span><span class="functiontext">World::Compile::get_rough_memory_usage</span><span class="plain">(</span><span class="identifier">K2</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">nw</span><span class="plain"> += 16;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">KW</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="functiontext">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"object"</span><span class="plain">, </span><span class="identifier">KW</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">nw</span><span class="plain">, 0, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">OBJECT_COMPILATION</span><span class="plain">, </span><span class="string">"Rough size estimate: %d words\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">nw</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">OBJECT_COMPILATION</span><span class="plain">, </span><span class="string">"Compilation of $j complete\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">);</span>
@ -293,7 +291,7 @@ For now, though, we make a parallel decision here.
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Emit::allocate_attributes is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function Properties::Emit::allocate_attributes is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Any either/or property which some value can hold is ineligible</span> <span class="cwebmacronumber">3.1</span>&gt; =

View file

@ -183,7 +183,7 @@ definition structure stands incomplete for a while. Filling it in is called
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::validate_definitions is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function Properties::Measurement::validate_definitions is used in 1/htc (<a href="1-htc.html#SP2_6">&#167;2.6</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Where:
</p>
@ -661,7 +661,7 @@ can't normally be unravelled at compile time.
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::compile_MADJ_routines is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Properties::Measurement::compile_MADJ_routines is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Comparative forms. </b>For timing reasons, these are made all at once, and later than when the headword
adjectives and superlatives are made.

View file

@ -87,7 +87,7 @@ a value with the owner; it isn't that either/or properties are unloved.)
<p class="inwebparagraph"></p>
<p class="endnote">The structure property is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/ep, 15/vp, 15/cp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure property is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/ep, 15/vp, 15/cp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The only four properties which have special significance to core Inform
(though plugins are interested in many others):
@ -649,7 +649,7 @@ sake:
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::is_shown_in_index is used in 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_9">&#167;3.2.1.7.9</a>), 16/in (<a href="16-in.html#SP16">&#167;16</a>, <a href="16-in.html#SP17">&#167;17</a>).</p>
<p class="endnote">The function Properties::is_shown_in_index is used in 8/ef (<a href="8-ef.html#SP12_9">&#167;12.9</a>), 16/in (<a href="16-in.html#SP16">&#167;16</a>, <a href="16-in.html#SP17">&#167;17</a>).</p>
<p class="endnote">The function Properties::exclude_from_index is used in <a href="#SP5">&#167;5</a>, 6/rlt (<a href="6-rlt.html#SP9_3_8">&#167;9.3.8</a>), 15/ep (<a href="15-ep.html#SP4">&#167;4</a>), 15/vp (<a href="15-vp.html#SP3">&#167;3</a>).</p>
@ -1084,11 +1084,11 @@ we find it, we compile it and return <code class="display"><span class="extract"
<p class="endnote">The function Properties::emit_single is used in 27/ei (<a href="27-ei.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Properties::emit is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function Properties::emit is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="endnote">The function Properties::emit_default_values appears nowhere else.</p>
<p class="endnote">The function Properties::annotate_attributes is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Properties::annotate_attributes is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Properties::emit_instance_permissions is used in 5/ins (<a href="5-ins.html#SP34">&#167;34</a>).</p>

View file

@ -57,21 +57,14 @@ aren't allowed to add I7-accessible properties.)
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">World::complete</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Instances::place_objects_in_definition_sequence</span><span class="plain">();</span>
<span class="identifier">model_world_under_construction</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Stages II and III of the completion process</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Stage IV of the completion process</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
<span class="identifier">model_world_under_construction</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">model_world_constructed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function World::complete is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function World::complete is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The model world is a broth with many cooks. On the one hand, we have the
various different INFSs, with their different needs &mdash; a various-to-various
@ -311,7 +304,7 @@ about the Portal, to stand.
<p class="inwebparagraph"></p>
<p class="endnote">The function World::complete_additions is used in 1/mr (<a href="1-mr.html#SP4_13">&#167;4.13</a>).</p>
<p class="endnote">The function World::complete_additions is used in 1/htc (<a href="1-htc.html#SP2_6">&#167;2.6</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="16-in.html">Back to 'Inferences'</a></li><li><a href="16-cmw2.html">Continue with 'Compile Model World'</a></li></ul><hr class="tocbar">

View file

@ -60,7 +60,7 @@ to write anything, then put the same question to the subjects.
<p class="inwebparagraph"></p>
<p class="endnote">The function World::Compile::compile is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function World::Compile::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="16-cmw.html">Back to 'Complete Model World'</a></li><li><a href="16-ic.html">Continue with 'Instance Counting'</a></li></ul><hr class="tocbar">

View file

@ -101,7 +101,7 @@ organised as linked lists; hence the <code class="display"><span class="extract"
<p class="inwebparagraph"></p>
<p class="endnote">The structure inference is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure inference is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Creation. </b>The following routine coins a newly minted inference which is not yet attached
to any subject: but it will not stay unattached for long. Note that if nothing
@ -125,7 +125,7 @@ has been said about likelihood, the sentence is assumed to be factually certain.
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;inferred_property</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;inferred_property_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;inferred_from</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;added_in_construction</span><span class="plain"> = </span><span class="identifier">model_world_under_construction</span><span class="plain">;</span>
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;added_in_construction</span><span class="plain"> = </span><span class="functiontext">Task::is_during_stage</span><span class="plain">(</span><span class="constant">MODEL_COMPLETE_CSEQ</span><span class="plain">);</span>
<span class="identifier">new_i</span><span class="plain">-</span><span class="element">&gt;next</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">new_i</span><span class="plain">;</span>
<span class="plain">}</span>
@ -473,7 +473,7 @@ knowledge means that the inferences must have a certainty of likely or better.
<p class="endnote">The function World::Inferences::verify_prop_states is used in 16/is (<a href="16-is.html#SP30">&#167;30</a>).</p>
<p class="endnote">The function World::Inferences::get_prop_state is used in 3/nl (<a href="3-nl.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function World::Inferences::get_prop_state is used in 3/nl (<a href="3-nl.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function World::Inferences::get_prop_state_at appears nowhere else.</p>

View file

@ -186,7 +186,7 @@ following.
<p class="inwebparagraph"></p>
<p class="endnote">The function InferenceSubjects::begin is used in 1/mr (<a href="1-mr.html#SP4_7">&#167;4.7</a>).</p>
<p class="endnote">The function InferenceSubjects::begin is used in 1/htc (<a href="1-htc.html#SP2_1">&#167;2.1</a>).</p>
<p class="endnote">The function InferenceSubjects::new_fundamental appears nowhere else.</p>

View file

@ -398,7 +398,7 @@ track of the content of each response.
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::compile_responses is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Strings::compile_responses is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Note that each rule is allowed to tell us that it already has a better
text for the response than the one we first created.
@ -505,9 +505,9 @@ divided up by the extensions containing the rules which produce them.
<pre class="displaydefn">
<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">RESPONSEDIVISIONS_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">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">group_ef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">group_E</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Make a ResponseDivisions entry</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">group_ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">group_E</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Make a ResponseDivisions entry</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
@ -532,9 +532,9 @@ divided up by the extensions containing the rules which produce them.
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = 0; </span><span class="identifier">marker</span><span class="plain"> &lt; 26; </span><span class="identifier">marker</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::rule_defines_response</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">marker</span><span class="plain">)) {</span>
<span class="identifier">tally</span><span class="plain">++;</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</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="functiontext">SourceFiles::get_extension_corresponding</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">R</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">ef</span><span class="plain"> == </span><span class="identifier">group_ef</span><span class="plain">) </span>&lt;<span class="cwebmacro">Start a possible run of matches</span> <span class="cwebmacronumber">7.3.1.1</span>&gt;
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">group_E</span><span class="plain">) </span>&lt;<span class="cwebmacro">Start a possible run of matches</span> <span class="cwebmacronumber">7.3.1.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">End a possible run of matches</span> <span class="cwebmacronumber">7.3.1.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">End a possible run of matches</span> <span class="cwebmacronumber">7.3.1.2</span>&gt;<span class="plain">;</span>
@ -552,9 +552,9 @@ divided up by the extensions containing the rules which produce them.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">contiguous_match</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">contiguous_match</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_cms</span><span class="plain">++ == 0) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">no_cms</span><span class="plain">++ == 0) &amp;&amp; (</span><span class="identifier">E</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">QT</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">QT</span><span class="plain">, </span><span class="string">"%&lt;X"</span><span class="plain">, </span><span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">QT</span><span class="plain">, </span><span class="string">"%&lt;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">);</span>
<span class="functiontext">Emit::array_text_entry</span><span class="plain">(</span><span class="identifier">QT</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">QT</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span>

View file

@ -437,7 +437,7 @@ number <code class="display"><span class="extract">-1</span></code>).
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Strings::TextLiterals::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Strings::TextLiterals::traverse_lts appears nowhere else.</p>
@ -447,7 +447,7 @@ number <code class="display"><span class="extract">-1</span></code>).
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) { </span> <span class="comment">to prevent trouble when no story file is really being made</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">()) { </span> <span class="comment">to prevent trouble when no story file is really being made</span>
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-</span><span class="element">&gt;lt_iname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TLT</span><span class="plain">);</span>

View file

@ -162,7 +162,7 @@ to do but panic.
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextSubstitutions::allow_no_further_text_subs is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Strings::TextSubstitutions::allow_no_further_text_subs is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>For some years these were compiled to routines verbosely called
<code class="display"><span class="extract">text_routine_1</span></code> and so on, but no longer:
@ -405,7 +405,7 @@ a request for a new text substitution to be compiled later...
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="constant">IMPLY_NEWLINES_IN_SAY_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">this_is_a_release_compile</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">this_is_a_debug_compile</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">(</span><span class="functiontext">Task::vm</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">IFDEBUG_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::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>

View file

@ -378,7 +378,7 @@ problem messages out into the open &mdash;
<p class="inwebparagraph"></p>
<p class="endnote">The function Lists::check is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Lists::check is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>That leaves just the compilation of lists at run-time. This used to be a
complex dance with initialisation code interleaved with heap construction,
@ -439,7 +439,7 @@ so there was once a two-page explanation here, but it is now blessedly simple.
<p class="inwebparagraph"></p>
<p class="endnote">The function Lists::compile is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Lists::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b>These are I6 word arrays, with the contents:
</p>

View file

@ -22,13 +22,12 @@
&lt;<span class="cwebmacro">Compile the blanks bitmap table</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Compile the Table of Tables</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
<span class="functiontext">Tables::Columns::compile_run_time_support</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Note the usage of run-time memory for tables</span> <span class="cwebmacronumber">1.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Support::compile is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Tables::Support::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile the data structures for entry storage</span> <span class="cwebmacronumber">1.1</span>&gt; =
@ -430,24 +429,6 @@ against the rules. (The Template file "Tables.i6t" defines it.)
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4"></a><b>&#167;1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Note the usage of run-time memory for tables</span> <span class="cwebmacronumber">1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">table</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">table</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;amendment_of</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"table"</span><span class="plain">,</span>
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;headline_fragment</span><span class="plain">),</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;approximate_array_space_needed</span><span class="plain">, 0, </span><span class="identifier">FALSE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The following allows tables to be said: it's a routine which switches on
table values and prints the (title-cased) name of the one which matches.
</p>
@ -515,7 +496,7 @@ table values and prints the (title-cased) name of the one which matches.
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Support::compile_print_table_names is used in 1/mr (<a href="1-mr.html#SP4_13">&#167;4.13</a>).</p>
<p class="endnote">The function Tables::Support::compile_print_table_names is used in 1/htc (<a href="1-htc.html#SP2_6">&#167;2.6</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="19-tb.html">Back to 'Tables'</a></li><li><a href="19-tod.html">Continue with 'Tables of Definitions'</a></li></ul><hr class="tocbar">

View file

@ -71,7 +71,7 @@ column ID numbers used at run-time.
<p class="inwebparagraph"></p>
<p class="endnote">The structure table_contribution is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure table_contribution is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>These are convenient during parsing.
</p>
@ -121,7 +121,7 @@ established names of tables and columns:
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::traverse_to_create is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Tables::traverse_to_create is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Tables::visit_to_create appears nowhere else.</p>
@ -148,7 +148,7 @@ see below.
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::traverse_to_stock is used in 1/mr (<a href="1-mr.html#SP4_11">&#167;4.11</a>, <a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Tables::traverse_to_stock is used in 1/htc (<a href="1-htc.html#SP2_4">&#167;2.4</a>, <a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Last and least: a traverse existing just to issue a problem message in a
case which Inform can often cope with, but which the experience of users
@ -177,7 +177,7 @@ suggests is never a good idea.
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::check_tables_for_kind_clashes is used in 1/mr (<a href="1-mr.html#SP4_13">&#167;4.13</a>).</p>
<p class="endnote">The function Tables::check_tables_for_kind_clashes is used in 1/htc (<a href="1-htc.html#SP2_6">&#167;2.6</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Table basics. </b>The following makes a blank structure for a table, but it isn't valid until
some of these fields have been properly filled in.
@ -1590,7 +1590,7 @@ people &mdash; it needs to be "yourself" instead, since "player" is a variable.
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::complete is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Tables::complete is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP26_1"></a><b>&#167;26.1. </b>For the actual code, see below.
</p>
@ -2012,8 +2012,8 @@ Rules, which of course are always present. So these are hidden by default.
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Show tables inside extensions (there are none in the main text)"</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="identifier">Index::extra_div_open</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, 1, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">efc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">) </span><span class="functiontext">Tables::index_tables_in</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">efc</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">efc</span><span class="plain"> = 0;</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="functiontext">Tables::index_tables_in</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">efc</span><span class="plain">++);</span>
<span class="identifier">Index::extra_div_close</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -2028,18 +2028,18 @@ and does nothing at all if that number is 0.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::index_tables_in</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">efc</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::index_tables_in</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">efc</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain"> = 0; </span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">table</span><span class="plain">) </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">)) </span><span class="identifier">tc</span><span class="plain">++;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">table</span><span class="plain">) </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">)) </span><span class="identifier">tc</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain"> &gt; 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</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">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">"&lt;i&gt;%+W&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;%S&lt;/i&gt;"</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">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML::begin_plain_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">table</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">))</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Index this table</span> <span class="cwebmacronumber">30.1</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML::end_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
@ -2142,11 +2142,11 @@ given extension:
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::table_within</span><span class="plain">(</span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">t</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">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;amendment_of</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">at_heading</span><span class="plain"> = </span><span class="functiontext">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;table_created_at</span><span class="plain">-</span><span class="element">&gt;source_table</span><span class="plain">));</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">at_ef</span><span class="plain"> = </span><span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">at_heading</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">at_ef</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">at_E</span><span class="plain"> = </span><span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">at_heading</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">at_E</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>

View file

@ -46,7 +46,7 @@ predicate associated with each possible table column C.
<p class="inwebparagraph"></p>
<p class="endnote">The structure table_column is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure table_column is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>When a column appears in a particular table, this is recorded with the
following structure. Note that it's possible for a kind to be named explicitly,

View file

@ -349,32 +349,20 @@ abstract, rather than with the actual property of some specific object.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">SIGIL_ARGUMENTS</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">SIGIL_ARGUMENTS</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">message</span><span class="plain">) {</span>
<span class="identifier">ACT_ON_SIGIL</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">Problems::quote_text</span><span class="plain">(2, </span><span class="identifier">message</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_begin</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, %2."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::Issue::extension_problem_S</span><span class="plain">(</span><span class="identifier">SIGIL_ARGUMENTS</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
<span class="identifier">ACT_ON_SIGIL</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(2, </span><span class="identifier">message</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_begin</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, %2."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Problems::Issue::extension_problem is used in 7/ss (<a href="7-ss.html#SP9_1">&#167;9.1</a>, <a href="7-ss.html#SP9_2">&#167;9.2</a>, <a href="7-ss.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Problems::Issue::extension_problem_S is used in 8/ef (<a href="8-ef.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Problems::Issue::extension_problem is used in 7/ss (<a href="7-ss.html#SP7_1">&#167;7.1</a>, <a href="7-ss.html#SP7_2">&#167;7.2</a>, <a href="7-ss.html#SP10">&#167;10</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Releasing problems. </b>These occur when the release instructions do not make sense. Sometimes it's
possible to pin down an exact place where the difficulty occurs, but

View file

@ -37,11 +37,23 @@ wouldn't auto-predeclare them; and there aren't so very many of them.)
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_phrase</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="functiontext">Phrases::write_HTML_representation</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="reserved">phrase</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="constant">INDEX_PHRASE_FORMAT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_extension</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_extension</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Problems::problem_quote</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Problems::expand_extension</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_extension</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="functiontext">Extensions::Files::write_full_title_to_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="reserved">extension_file</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">Extensions::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="identifier">inform_extension</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_copy</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">inbuild_copy</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Problems::problem_quote</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Problems::expand_copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_copy</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Copies::write_copy</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="identifier">inbuild_copy</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_work</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Problems::problem_quote</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Problems::expand_work</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_work</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="identifier">inbuild_work</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_object</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Problems::problem_quote</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Problems::expand_object</span><span class="plain">);</span>
@ -62,10 +74,18 @@ wouldn't auto-predeclare them; and there aren't so very many of them.)
<p class="endnote">The function Problems::expand_phrase appears nowhere else.</p>
<p class="endnote">The function Problems::quote_extension is used in 2/si (<a href="2-si.html#SP11">&#167;11</a>), 8/ef (<a href="8-ef.html#SP18">&#167;18</a>), 8/ie (<a href="8-ie.html#SP9">&#167;9</a>, <a href="8-ie.html#SP9_2">&#167;9.2</a>, <a href="8-ie.html#SP9_1_1">&#167;9.1.1</a>, <a href="8-ie.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Problems::quote_extension is used in 2/si (<a href="2-si.html#SP11">&#167;11</a>), 8/ef (<a href="8-ef.html#SP8">&#167;8</a>), 8/ie (<a href="8-ie.html#SP9">&#167;9</a>, <a href="8-ie.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Problems::expand_extension appears nowhere else.</p>
<p class="endnote">The function Problems::quote_copy is used in 8/ie (<a href="8-ie.html#SP9_1_1">&#167;9.1.1</a>).</p>
<p class="endnote">The function Problems::expand_copy appears nowhere else.</p>
<p class="endnote">The function Problems::quote_work is used in 3/rst (<a href="3-rst.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Problems::expand_work appears nowhere else.</p>
<p class="endnote">The function Problems::quote_object is used in <a href="#SP2">&#167;2</a>, 2/si (<a href="2-si.html#SP2">&#167;2</a>, <a href="2-si.html#SP7">&#167;7</a>), 5/ins (<a href="5-ins.html#SP19_1">&#167;19.1</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Since numerous instances are created without explicit and distinct
@ -117,11 +137,11 @@ this as some kind of marginal will-never-happen case.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_invocation</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="functiontext">Phrases::TypeData::Textual::inv_write_HTML_representation</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="identifier">parse_node</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_extension_id</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">extension_identifier</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_extension_id</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">Problems::problem_quote</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Problems::expand_extension_id</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::expand_extension_id</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="functiontext">Extensions::IDs::write_to_HTML_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="reserved">extension_identifier</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Works::write_to_HTML_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, (</span><span class="identifier">inbuild_work</span><span class="plain"> *) </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_property</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">property</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) { </span><span class="identifier">Problems::quote_wording</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">); }</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::quote_table</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">tab</span><span class="plain">) {</span>
@ -139,7 +159,7 @@ this as some kind of marginal will-never-happen case.
<p class="endnote">The function Problems::expand_invocation appears nowhere else.</p>
<p class="endnote">The function Problems::quote_extension_id is used in 7/hdn (<a href="7-hdn.html#SP20_1">&#167;20.1</a>, <a href="7-hdn.html#SP21_1">&#167;21.1</a>, <a href="7-hdn.html#SP20_2">&#167;20.2</a>).</p>
<p class="endnote">The function Problems::quote_extension_id is used in 7/hdn (<a href="7-hdn.html#SP21_1">&#167;21.1</a>, <a href="7-hdn.html#SP22_1">&#167;22.1</a>, <a href="7-hdn.html#SP21_2">&#167;21.2</a>).</p>
<p class="endnote">The function Problems::expand_extension_id appears nowhere else.</p>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/wel</title>
<title>1/htc</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">
@ -15,7 +15,6 @@
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">REDIRECT_PROBLEM_SOURCE_TO</span><span class="plain"> </span><span class="identifier">pathname_of_project</span>
<span class="definitionkeyword">define</span> <span class="constant">PROBLEMS_HTML_EMITTER</span><span class="plain"> </span><span class="identifier">HTMLFiles::char_out</span>
</pre>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Inform tops and tails its output of problem messages, and it also prints
@ -29,9 +28,9 @@ non-problem messages when everything was fine. That all happens here:
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::Using::start_problems_report</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">problems_file</span><span class="plain">, </span><span class="identifier">filename_of_report</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open problem log"</span><span class="plain">, </span><span class="identifier">filename_of_report</span><span class="plain">);</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Problems::Using::start_problems_report</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">problems_file</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open problem log"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">HTMLFiles::html_header</span><span class="plain">(</span><span class="identifier">problems_file</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Translating the Source"</span><span class="plain">);</span>
<span class="plain">}</span>

View file

@ -70,7 +70,7 @@ instance has its own <code class="display"><span class="extract">equation_symbol
<p class="inwebparagraph"></p>
<p class="endnote">The structure equation_symbol is accessed in 1/kts, 2/sq, 2/si, 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 5/nv, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 8/ed2, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/pk, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/pr, 15/ep, 15/vp, 15/cp, 15/spr, 16/is, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/rsft, 19/tod, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure equation_symbol is accessed in 2/sq, 2/si, 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 5/nv, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ef, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/pk, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/pr, 15/ep, 15/vp, 15/cp, 15/spr, 16/is, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/rsft, 19/tod, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>In addition, there are some standing symbols used by all equations: the
constant "pi", for example. They're stored in this linked list:
@ -183,7 +183,7 @@ value <code class="display"><span class="extract">pi</span></code>.
<p class="inwebparagraph"></p>
<p class="endnote">The function Equations::traverse_to_create is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Equations::traverse_to_create is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Equations::visit_to_create appears nowhere else.</p>
@ -419,7 +419,7 @@ source text:
<p class="inwebparagraph"></p>
<p class="endnote">The function Equations::traverse_to_stock is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Equations::traverse_to_stock is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>And, as with creation, <code class="display"><span class="extract">Equations::examine</span></code> is called explicitly in the meaning
list converter when an equation is found inline. So in all cases, we call the
@ -1824,7 +1824,7 @@ are obliged to issue a problem message.
<span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;gK_before</span><span class="plain"> =</span>
<span class="identifier">Kinds::FloatingPoint::new_gk</span><span class="plain">(</span>
<span class="identifier">ParseTree::get_kind_of_value</span><span class="plain">(</span><span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;leaf_constant</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;enode_promotion</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">VirtualMachines::supports</span><span class="plain">(</span><span class="identifier">K_real_number</span><span class="plain">)))</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;enode_promotion</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Kinds::RunTime::target_VM_supports</span><span class="plain">(</span><span class="identifier">K_real_number</span><span class="plain">)))</span>
<span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;gK_before</span><span class="plain"> =</span>
<span class="identifier">Kinds::FloatingPoint::to_real</span><span class="plain">(</span><span class="identifier">tok</span><span class="plain">-</span><span class="element">&gt;gK_before</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -2197,7 +2197,7 @@ for equations a value; they are never called.
<p class="inwebparagraph"></p>
<p class="endnote">The function Equations::compile is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Equations::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP44"></a><b>&#167;44. </b>These identifiers are used to compile equation names as values, so:
</p>

View file

@ -48,11 +48,11 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure activity is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure activity is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure activity_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure activity_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure activity_crossref is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure activity_crossref is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
@ -461,7 +461,7 @@ noun for it; for example, the "announcing activity".
<p class="endnote">The function Activities::add_variable is used in 9/ma (<a href="9-ma.html#SP3_3_25_1">&#167;3.3.25.1</a>).</p>
<p class="endnote">The function Activities::activity_var_creators is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::activity_var_creators is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Activity indexing. </b></p>
@ -907,15 +907,15 @@ values, of the kind to which the activity applies.
<p class="endnote">The function Activities::emit_activity_list is used in 22/prcd (<a href="22-prcd.html#SP10_5">&#167;10.5</a>).</p>
<p class="endnote">The function Activities::compile_activity_constants is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::compile_activity_constants is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Activities::Activity_before_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::Activity_before_rulebooks_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Activities::Activity_for_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::Activity_for_rulebooks_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Activities::Activity_after_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::Activity_after_rulebooks_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Activities::Activity_atb_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Activities::Activity_atb_rulebooks_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Activities::annotate_list_for_cross_references is used in 22/prcd (<a href="22-prcd.html#SP10_5">&#167;10.5</a>).</p>

View file

@ -117,9 +117,9 @@ its outcomes.
<p class="inwebparagraph"></p>
<p class="endnote">The structure named_rulebook_outcome is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure named_rulebook_outcome is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure rulebook_outcome is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure rulebook_outcome is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
@ -608,7 +608,7 @@ can be used in a void context as a sort of return-from-rule phrase.
<p class="endnote">The function Rulebooks::Outcomes::index_outcomes is used in 21/rl2 (<a href="21-rl2.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::RulebookOutcomePrintingRule is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::RulebookOutcomePrintingRule is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::get_default_value is used in 13/rsfk (<a href="13-rsfk.html#SP5">&#167;5</a>).</p>

View file

@ -85,7 +85,7 @@ see below.
<p class="inwebparagraph"></p>
<p class="endnote">The structure rule is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/prcd, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure rule is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/prcd, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -1373,7 +1373,7 @@ I wonder how useful this really is, but it was much requested at one time.
<p class="endnote">The function Rules::rule_defines_response is used in 17/ts (<a href="17-ts.html#SP11">&#167;11</a>), 17/rs (<a href="17-rs.html#SP4">&#167;4</a>, <a href="17-rs.html#SP7_1">&#167;7.1</a>, <a href="17-rs.html#SP7_3_1">&#167;7.3.1</a>, <a href="17-rs.html#SP12_1_1">&#167;12.1.1</a>).</p>
<p class="endnote">The function Rules::check_response_usages is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Rules::check_response_usages is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Rules::now_rule_defines_response is used in 17/rs (<a href="17-rs.html#SP12_1_1">&#167;12.1.1</a>), 26/tti (<a href="26-tti.html#SP7">&#167;7</a>).</p>

View file

@ -120,7 +120,7 @@ have affected it in this way:
<p class="inwebparagraph"></p>
<p class="endnote">The structure placement_affecting is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure placement_affecting is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>As rulebooks are declared, the first few are quietly copied into
a small array: that way, we can always obtain a pointer to, say, the
@ -673,7 +673,7 @@ built (for instance, scene endings).
<p class="endnote">The function Rulebooks::get_stv_creator_iname is used in <a href="#SP14_1">&#167;14.1</a>.</p>
<p class="endnote">The function Rulebooks::rulebook_var_creators is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Rulebooks::rulebook_var_creators is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make slow lookup routine</span> <span class="cwebmacronumber">14.1</span>&gt; =
@ -1231,10 +1231,10 @@ popular rulebooks, showing their contents in logical order.
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">) &gt; 0)</span>
&lt;<span class="cwebmacro">Index the segment for new rulebooks and activities</span> <span class="cwebmacronumber">23.10</span>&gt;<span class="plain">;</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> != </span><span class="identifier">standard_rules_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">) &gt; 0)</span>
<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="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">) &gt; 0)</span>
&lt;<span class="cwebmacro">Index the segment for the rulebooks in this extension</span> <span class="cwebmacronumber">23.11</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -1477,7 +1477,7 @@ popular rulebooks, showing their contents in logical order.
<pre class="displaydefn">
<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">"&lt;b&gt;From the source text&lt;/b&gt;"</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="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">that is, not in an extension at all</span>
<span class="identifier">inform_extension</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="comment">that is, not in an extension at all</span>
&lt;<span class="cwebmacro">Index rulebooks occurring in this part of the source text</span> <span class="cwebmacronumber">23.10.1</span>&gt;<span class="plain">;</span>
</pre>
@ -1492,7 +1492,7 @@ popular rulebooks, showing their contents in logical order.
<pre class="displaydefn">
<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">"&lt;b&gt;From the extension "</span><span class="plain">);</span>
<span class="functiontext">Extensions::IDs::write_to_HTML_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Works::write_to_HTML_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">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">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Index rulebooks occurring in this part of the source text</span> <span class="cwebmacronumber">23.10.1</span>&gt;<span class="plain">;</span>
</pre>
@ -1512,14 +1512,14 @@ popular rulebooks, showing their contents in logical order.
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</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="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</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">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</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">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">E</span><span class="plain">))</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</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="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">av</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">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</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">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">E</span><span class="plain">))</span>
<span class="functiontext">Activities::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">, 1);</span>
<span class="plain">}</span>
</pre>
@ -1532,20 +1532,20 @@ popular rulebooks, showing their contents in logical order.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::noteworthy_rulebooks</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">nb</span><span class="plain"> = 0;</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</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="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</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">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="identifier">nb</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">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">E</span><span class="plain">)) </span><span class="identifier">nb</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</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="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">av</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">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="identifier">nb</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">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">E</span><span class="plain">)) </span><span class="identifier">nb</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">nb</span><span class="plain">;</span>
<span class="plain">}</span>

View file

@ -50,13 +50,13 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure stacked_variable is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure stacked_variable is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure stacked_variable_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure stacked_variable_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure stacked_variable_owner is private to this section.</p>
<p class="endnote">The structure stacked_variable_owner_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure stacked_variable_owner_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>

View file

@ -89,7 +89,7 @@ name of a new constant.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::traverse_for_names is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Phrases::Manager::traverse_for_names is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Phrases::Manager::visit_for_names appears nowhere else.</p>
@ -200,7 +200,7 @@ placement later on.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::traverse is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Phrases::Manager::traverse is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Phrases::Manager::visit_to_count appears nowhere else.</p>
@ -227,7 +227,7 @@ counting local variables, whose names only exist fleetingly).
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::register_meanings is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Phrases::Manager::register_meanings is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Noon. </b>When the final phrase is registered, the hour chimes. From this point
onwards, there's no longer any text which can't be parsed because some
@ -276,7 +276,7 @@ correctly refer to the most recently mentioned action.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::parse_rule_parameters is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Phrases::Manager::parse_rule_parameters is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>We can finally make the automatic placements of rules into rulebooks: so
our "fire alarm rule" will at last be placed in the "Instead" rulebook. The
@ -296,7 +296,7 @@ PHRCDs are used to make sure it appears in the right position.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::add_rules_to_rulebooks is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Phrases::Manager::add_rules_to_rulebooks is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>It might seem as if the rulebooks are now complete, but this is not true,
because we still have to take care of manual placements like:
@ -333,7 +333,7 @@ only conditionally, or substituted by other rules.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::parse_rule_placements is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Phrases::Manager::parse_rule_placements is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Phrases::Manager::visit_to_parse_placements appears nowhere else.</p>
@ -363,7 +363,7 @@ adjective definitions.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::compile_first_block is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::compile_first_block is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Count up the scale of the task</span> <span class="cwebmacronumber">10.1</span>&gt; =
@ -598,11 +598,11 @@ noted down:
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::rulebooks_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Phrases::Manager::compile_rulebooks is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::compile_rulebooks is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Phrases::Manager::RulebookNames_array is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::RulebookNames_array is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>And finally, just as the sun slips below the horizon, we compile the code
which prints out values of the kind "rule" at run-time &mdash; for example, taking
@ -620,7 +620,7 @@ printing out "fire alarm rule".
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::RulePrintingRule_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::RulePrintingRule_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Evening. </b>The twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
@ -692,7 +692,7 @@ can be called multiple times in the course of the evening.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Manager::compile_as_needed is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Manager::compile_as_needed is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="22-itp.html">Back to 'Introduction to Phrases'</a></li><li><a href="22-ph.html">Continue with 'Phrases'</a></li></ul><hr class="tocbar">

View file

@ -41,7 +41,7 @@ own right, a functional-programming sort of device. For example:
<p class="inwebparagraph"></p>
<p class="endnote">The structure constant_phrase is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure constant_phrase is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Here we create a new named phrase ("doubling", say):
</p>
@ -188,7 +188,7 @@ an I6 routine name, but no: it compiles to a small array called a "closure".
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Constants::compile_closures is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Constants::compile_closures is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>The closure array consists of three words: the strong kind ID, the address
of the routine, and the text of the name. (The latter enables us to print

View file

@ -693,7 +693,7 @@ response to "requests". All other phrases are compiled just once.
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::invoke_to_begin is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::invoke_to_begin is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="22-cs.html">Back to 'Construction Sequence'</a></li><li><a href="22-pu.html">Continue with 'Phrase Usage'</a></li></ul><hr class="tocbar">

View file

@ -33,8 +33,8 @@ suppress indexing of their definitions.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::Index::index_page_Phrasebook</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass</span><span class="plain">=1; </span><span class="identifier">pass</span><span class="plain">&lt;=2; </span><span class="identifier">pass</span><span class="plain">++) {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">last_extension_named</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">division</span><span class="plain"> = 0, </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain">); </span><span class="identifier">division</span><span class="plain"> &lt;= </span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">division</span><span class="plain">++) {</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">last_extension_named</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">division</span><span class="plain"> = 0, </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">inform_extension</span><span class="plain">); </span><span class="identifier">division</span><span class="plain"> &lt;= </span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">division</span><span class="plain">++) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">last_heading_named</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_subdivision_yet</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CLW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
@ -48,7 +48,7 @@ suppress indexing of their definitions.
<span class="functiontext">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="functiontext">Phrases::declaration_node</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Sentences::Headings::indexed</span><span class="plain">(</span><span class="identifier">this_heading</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="comment">and only if that heading lies in the piece of source for this division</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
<span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">this_heading</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">division</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">) { </span> <span class="comment">skip phrase unless it's in the source text</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_extension</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
@ -89,13 +89,13 @@ the extension's name as a major subheading in our index.
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">in1\</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;Defined in the source&lt;/b&gt;"</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="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_extension</span><span class="plain"> != </span><span class="identifier">standard_rules_extension</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">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">this_extension</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">pass</span><span class="plain"> == 2) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">in1\</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;From the extension "</span><span class="plain">);</span>
<span class="functiontext">Extensions::Files::write_name_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Extensions::write_name_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by "</span><span class="plain">);</span>
<span class="functiontext">Extensions::Files::write_author_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Extensions::write_author_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</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>
@ -120,7 +120,7 @@ each has a paragraph of its own.
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">HW</span><span class="plain"> = </span><span class="functiontext">Sentences::Headings::get_text</span><span class="plain">(</span><span class="identifier">this_heading</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">HW</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span>&lt;<span class="cwebmacro">Strip away bracketed matter in the heading name</span> <span class="cwebmacronumber">1.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_extension</span><span class="plain"> == </span><span class="identifier">standard_rules_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">this_extension</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Mark a faked division due to inter-hyphen clue in SR heading</span> <span class="cwebmacronumber">1.2.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>

View file

@ -59,7 +59,7 @@ valid as values, since a condition is not also a value in Inform 7.
<p class="inwebparagraph"></p>
<p class="endnote">The structure phrase_option is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure phrase_option is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Creation. </b>By default, a phrase has no options.
</p>

View file

@ -41,7 +41,7 @@ defined as "At 9:00 AM: ..." But two values are special:
<p class="inwebparagraph"></p>
<p class="endnote">The structure use_as_event is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure use_as_event is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Timed events are stored in two simple arrays, processed by run-time code.
</p>
@ -91,9 +91,9 @@ defined as "At 9:00 AM: ..." But two values are special:
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Timed::TimedEventsTable is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>), 22/cs (<a href="22-cs.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Phrases::Timed::TimedEventsTable is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>), 22/cs (<a href="22-cs.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Phrases::Timed::TimedEventTimesTable is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>), 22/cs (<a href="22-cs.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Phrases::Timed::TimedEventTimesTable is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>), 22/cs (<a href="22-cs.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>That's it, really: everything else is just indexing.
</p>
@ -144,7 +144,7 @@ arguably shouldn't block compilation. Then again...
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Timed::check_for_unused is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Phrases::Timed::check_for_unused is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>And here's the actual index segment.
</p>

View file

@ -182,7 +182,7 @@ the doubled use of colons is unfortunate.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Adjectives::traverse is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Phrases::Adjectives::traverse is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Phrases::Adjectives::look_for_headers appears nowhere else.</p>

View file

@ -325,7 +325,7 @@ late to create any further past tense references, so:
<p class="inwebparagraph"></p>
<p class="endnote">The function Chronology::allow_no_further_past_tenses is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Chronology::allow_no_further_past_tenses is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The <code class="display"><span class="extract">{-A}</span></code> ("past actions") escape.
A series of <code class="display"><span class="extract">if</span></code> statements checking whether each past-tense action is now
@ -404,7 +404,7 @@ ever tampered with.
<p class="inwebparagraph"></p>
<p class="endnote">The function Chronology::past_actions_i6_routines is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Chronology::past_actions_i6_routines is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
@ -454,7 +454,7 @@ ever tampered with.
<p class="inwebparagraph"></p>
<p class="endnote">The function Chronology::past_tenses_i6_escape is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Chronology::past_tenses_i6_escape is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Unpack the past</span> <span class="cwebmacronumber">7.1</span>&gt; =
@ -931,7 +931,7 @@ times".
<p class="inwebparagraph"></p>
<p class="endnote">The function Chronology::chronology_extents_i6_escape is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Chronology::chronology_extents_i6_escape is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="24-sf.html">Back to 'Stack Frames'</a></li><li><i>(This section ends Chapter 24: Compilation Context.)</i></li></ul><hr class="tocbar">

View file

@ -102,7 +102,7 @@ marks it as deallocated.
<p class="inwebparagraph"></p>
<p class="endnote">The structure local_variable is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure local_variable is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>A local variable needs to be stored somewhere at run-time. The obvious
correspondence is to put these into I6 local variables, which are, in effect,
@ -462,7 +462,7 @@ scratch work-space which can be used in the compiled code.
<p class="endnote">The function LocalVariables::add_named_call is used in <a href="#SP47">&#167;47</a>, 13/rsfk (<a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>), 21/rb (<a href="21-rb.html#SP23">&#167;23</a>), 22/pav (<a href="22-pav.html#SP9_2">&#167;9.2</a>).</p>
<p class="endnote">The function LocalVariables::add_named_call_as_symbol is used in 4/am (<a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 6/rlt (<a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP19">&#167;19</a>), 12/cad (<a href="12-cad.html#SP5">&#167;5</a>), 12/cdp (<a href="12-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="12-cdp.html#SP2_1_5_2">&#167;2.1.5.2</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 17/rs (<a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>), 21/rb (<a href="21-rb.html#SP24_1_1">&#167;24.1.1</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 24/ch (<a href="24-ch.html#SP7">&#167;7</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>).</p>
<p class="endnote">The function LocalVariables::add_named_call_as_symbol is used in 4/am (<a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 6/rlt (<a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP9">&#167;9</a>), 12/cad (<a href="12-cad.html#SP5">&#167;5</a>), 12/cdp (<a href="12-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="12-cdp.html#SP2_1_5_2">&#167;2.1.5.2</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 17/rs (<a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>), 21/rb (<a href="21-rb.html#SP24_1_1">&#167;24.1.1</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 24/ch (<a href="24-ch.html#SP7">&#167;7</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>).</p>
<p class="endnote">The function LocalVariables::add_named_call_as_symbol_noting is used in 6/rlt (<a href="6-rlt.html#SP15_2">&#167;15.2</a>).</p>

View file

@ -586,8 +586,8 @@ no subsequent lines are looked at.
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ARGUMENTTYPEFAILED_HL</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</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">sl</span><span class="plain">.</span><span class="identifier">line_number</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</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="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain">) </span><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">ef</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> + 1);</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</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="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">) </span><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>
</pre>

View file

@ -2411,7 +2411,7 @@ because neither syntax will compile when I6 is compiling for the other VM.
<span class="identifier">Produce::ref_iname</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="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">UNICODE_TEMP_HL</span><span class="plain">));</span>
<span class="functiontext">Specifications::Compiler::emit_to_kind</span><span class="plain">(</span><span class="identifier">to_say</span><span class="plain">, </span><span class="identifier">K</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="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">()) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">())) {</span>
<span class="identifier">Produce::inv_assembly</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"@print_unicode"</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_iname</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="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">UNICODE_TEMP_HL</span><span class="plain">));</span>

View file

@ -84,12 +84,6 @@ should always be supplied for "To..." phrases, but left null for rules.
<pre class="displaydefn">
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">definition_area</span><span class="plain"> =</span>
<span class="functiontext">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">));</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">definition_extension</span><span class="plain"> =</span>
<span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">definition_area</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">definition_extension</span><span class="plain">)</span>
<span class="functiontext">Extensions::Files::write_I6_comment_describing</span><span class="plain">(</span><span class="identifier">definition_extension</span><span class="plain">);</span>
<span class="functiontext">Routines::ToPhrases::comment_on_request</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">);</span>
<span class="functiontext">Phrases::Usage::write_I6_comment_describing</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain">));</span>
</pre>

180
docs/core-module/26-fc.html Normal file
View file

@ -0,0 +1,180 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>25/cp</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 '26/fc' 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#26">Chapter 26: Compilation Utilities</a></li><li><b>Fundamental Constants</b></li></ul><p class="purpose">Inter constants for, say, extremal number values, which depend on the target we are compiling to, and are generally low-level in nature.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Fundamental constants are emitted about our choice of virtual machine.
</p>
<p class="inwebparagraph">The old I6 library used to confuse Z-vs-G with 16-vs-32-bit, but we try
to separate these distinctions here, even though at present the Z-machine
is our only 16-bit target and Glulx our only 32-bit one. The <code class="display"><span class="extract">WORDSIZE</span></code>
constant is the word size in bytes, so is the multiplier between <code class="display"><span class="extract">-&gt;</span></code> and
<code class="display"><span class="extract">--&gt;</span></code> offsets in I6 pointer syntax.
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(1) <code class="display"><span class="extract">NULL</span></code> is used, as in C, to represent a null value or pointer. In C,
this is conventionally 0, but here it is the maximum unsigned value which
can be stored, pointing to the topmost byte in the directly addressable
memory map; this means it is also -1 when regarded as a signed
twos-complement integer, but we write it as an unsigned hexadecimal
address for clarity's sake.
</li></ul>
<ul class="items"><li>(2) <code class="display"><span class="extract">WORD_HIGHBIT</span></code> is the most significant bit in the VM's data word.
</li></ul>
<ul class="items"><li>(3) <code class="display"><span class="extract">IMPROBABLE_VALUE</span></code> is one which is unlikely but still possible
to be a genuine I7 value. The efficiency of some algorithms depends on
how well chosen this is: they would ran badly if we chose 1, for instance.
</li></ul>
<ul class="items"><li>(4) <code class="display"><span class="extract">MAX_POSITIVE_NUMBER</span></code> is the largest representable positive (signed)
integer, in twos-complement form.
</li></ul>
<ul class="items"><li>(5) <code class="display"><span class="extract">REPARSE_CODE</span></code> is a magic value used in the I6 library's parser to
signal that some code which ought to have been parsing a command has in
fact rewritten it, so that the whole command must be re-parsed afresh.
(Returning this value is like throwing an exception in a language like
Java, though we don't implement it that way.) A comment in the 6/11 library
reads: "The parser rather gunkily adds addresses to <code class="display"><span class="extract">REPARSE_CODE</span></code> for
some purposes. And expects the result to be greater than <code class="display"><span class="extract">REPARSE_CODE</span></code>
(signed comparison). So Glulx Inform is limited to a single gigabyte of
storage, for the moment." Guilty as charged, but the gigabyte story file
is a remote prospect for now. Anyway, it's this comparison issue which
means we need a different value for each possible word size.
</li></ul>
<pre class="display">
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</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="identifier">id</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>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">FundamentalConstants::emit_signed</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</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="identifier">id</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>
<span class="functiontext">Emit::named_numeric_constant_signed</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</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="identifier">id</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>
<span class="functiontext">Emit::named_numeric_constant_hex</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">FundamentalConstants::emit_unchecked_hex</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</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="identifier">id</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>
<span class="functiontext">Emit::named_unchecked_constant_hex</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">FundamentalConstants::emit</span><span class="plain">(</span><span class="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">VM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VM</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">"target VM not set yet"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">))</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">DEBUG_HL</span><span class="plain">, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">-&gt;</span><span class="identifier">family_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Z-Machine"</span><span class="plain">)) {</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">TARGET_ZCODE_HL</span><span class="plain">, 1);</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">DICT_WORD_SIZE_HL</span><span class="plain">, 6);</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">Str::eq</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">-&gt;</span><span class="identifier">family_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Glulx"</span><span class="plain">)) {</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">TARGET_GLULX_HL</span><span class="plain">, 1);</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">DICT_WORD_SIZE_HL</span><span class="plain">, 9);</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">INDIV_PROP_START_HL</span><span class="plain">, 0);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">)) {</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">WORDSIZE_HL</span><span class="plain">, 2);</span>
<span class="functiontext">FundamentalConstants::emit_unchecked_hex</span><span class="plain">(</span><span class="constant">NULL_HL</span><span class="plain">, 0</span><span class="identifier">xffff</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">WORD_HIGHBIT_HL</span><span class="plain">, 0</span><span class="identifier">x8000</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">WORD_NEXTTOHIGHBIT_HL</span><span class="plain">, 0</span><span class="identifier">x4000</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">IMPROBABLE_VALUE_HL</span><span class="plain">, 0</span><span class="identifier">x7fe3</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">REPARSE_CODE_HL</span><span class="plain">, 10000);</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">MAX_POSITIVE_NUMBER_HL</span><span class="plain">, 32767);</span>
<span class="functiontext">FundamentalConstants::emit_signed</span><span class="plain">(</span><span class="constant">MIN_NEGATIVE_NUMBER_HL</span><span class="plain">, -32768);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">WORDSIZE_HL</span><span class="plain">, 4);</span>
<span class="functiontext">FundamentalConstants::emit_unchecked_hex</span><span class="plain">(</span><span class="constant">NULL_HL</span><span class="plain">, 0</span><span class="identifier">xffffffff</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">WORD_HIGHBIT_HL</span><span class="plain">, 0</span><span class="identifier">x80000000</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">WORD_NEXTTOHIGHBIT_HL</span><span class="plain">, 0</span><span class="identifier">x40000000</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">IMPROBABLE_VALUE_HL</span><span class="plain">, 0</span><span class="identifier">xdeadce11</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_hex</span><span class="plain">(</span><span class="constant">REPARSE_CODE_HL</span><span class="plain">, 0</span><span class="identifier">x40000000</span><span class="plain">);</span>
<span class="functiontext">FundamentalConstants::emit_one</span><span class="plain">(</span><span class="constant">MAX_POSITIVE_NUMBER_HL</span><span class="plain">, 2147483647);</span>
<span class="functiontext">FundamentalConstants::emit_signed</span><span class="plain">(</span><span class="constant">MIN_NEGATIVE_NUMBER_HL</span><span class="plain">, -2147483648);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function FundamentalConstants::emit_one appears nowhere else.</p>
<p class="endnote">The function FundamentalConstants::emit_signed appears nowhere else.</p>
<p class="endnote">The function FundamentalConstants::emit_hex appears nowhere else.</p>
<p class="endnote">The function FundamentalConstants::emit_unchecked_hex appears nowhere else.</p>
<p class="endnote">The function FundamentalConstants::emit is used in 27/ei (<a href="27-ei.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This version-numbering constant is not really to do with the VM (it is
Inform's own version number), but it belongs nowhere else either, so:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">FundamentalConstants::emit_build_number</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">build</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">build</span><span class="plain">, </span><span class="string">"%B"</span><span class="plain">, </span><span class="identifier">TRUE</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">NI_BUILD_COUNT_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">build</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>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">build</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function FundamentalConstants::emit_build_number is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This also doesn't really belong here, but...
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">FundamentalConstants::veto_number</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">X</span><span class="plain"> &gt; 32767) || (</span><span class="identifier">X</span><span class="plain"> &lt; -32768)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()))) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LiteralOverflow</span><span class="plain">),</span>
<span class="string">"you use a number which is too large"</span><span class="plain">,</span>
<span class="string">"at least with the Settings for this project as they currently "</span>
<span class="string">"are. (Change to Glulx to be allowed to use much larger numbers.)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function FundamentalConstants::veto_number appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 26: Compilation Utilities.)</i></li><li><a href="26-i6i.html">Continue with 'Inform 6 Inclusions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>26/vm</title>
<title>26/fc</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">
@ -350,7 +350,7 @@ requests, which, again, we do by instructing the Template code.
<p class="endnote">The function Config::Inclusions::compile_inclusions_for_subject is used in 15/epv (<a href="15-epv.html#SP1_1_2">&#167;1.1.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-vm.html">Back to 'Virtual Machines'</a></li><li><a href="26-uo.html">Continue with 'Use Options'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="26-fc.html">Back to 'Fundamental Constants'</a></li><li><a href="26-uo.html">Continue with 'Use Options'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -67,9 +67,9 @@ and <code class="display"><span class="extract">+)</span></code> Inform 7 escape
<p class="inwebparagraph"></p>
<p class="endnote">The function I6T::interpret_kindt is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function I6T::interpret_kindt appears nowhere else.</p>
<p class="endnote">The function I6T::interpret_indext is used in 1/mr (<a href="1-mr.html#SP4_17">&#167;4.17</a>).</p>
<p class="endnote">The function I6T::interpret_indext is used in 3/nl (<a href="3-nl.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function I6T::interpret_i6t is used in 26/i6i (<a href="26-i6i.html#SP7">&#167;7</a>, <a href="26-i6i.html#SP8">&#167;8</a>), 26/uo (<a href="26-uo.html#SP17">&#167;17</a>).</p>
@ -166,7 +166,11 @@ file.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">segment_name</span><span class="plain">) &gt; 0) {</span>
&lt;<span class="cwebmacro">Open the I6 template file</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"inform: Unable to open segment &lt;%S&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">segment_name</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::unlocated_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">or anyway not usefully testable</span>
<span class="string">"I couldn't open a requested I6T segment: see the console "</span>
<span class="string">"output for details."</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">index_template</span><span class="plain">) {</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">index_template</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">Input_File</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
@ -181,41 +185,6 @@ file.
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_1_1"></a><b>&#167;2.1.1. </b>We look for the <code class="display"><span class="extract">.i6t</span></code> files first in the materials folder, then in the
installed area and lastly (but almost always) in the built-in resources.
Within those, we look inside <code class="display"><span class="extract">Inter/kinds</span></code> for <code class="display"><span class="extract">*.kindt</span></code> files,
and <code class="display"><span class="extract">Inter/miscellaneous</span></code> for <code class="display"><span class="extract">*.i6t</span></code> files (though at present Inform makes
no use of this ability).
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Open the I6 template file</span> <span class="cwebmacronumber">2.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="constant">NO_FS_AREAS</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Input_File</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">pathname_of_inter_resources</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">int_mode</span><span class="plain"> == </span><span class="constant">KINDT_MODE</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kinds"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"miscellaneous"</span><span class="plain">);</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">segment_name</span><span class="plain">), </span><span class="string">"r"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Input_File</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"inform: Unable to open segment &lt;%S&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">segment_name</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::unlocated_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">or anyway not usefully testable</span>
<span class="string">"I couldn't open a requested I6T segment: see the console "</span>
<span class="string">"output for details."</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_1">&#167;2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b>I6 template files are encoded as ISO Latin-1, not as Unicode UTF-8, so
ordinary <code class="display"><span class="extract">fgetc</span></code> is used, and no BOM marker is parsed. Lines are assumed
to be terminated with either <code class="display"><span class="extract">0x0a</span></code> or <code class="display"><span class="extract">0x0d</span></code>. (Since blank lines are

View file

@ -181,7 +181,7 @@ specification <code class="display"><span class="extract">--&gt; 0</span></code>
<p class="endnote">The function JumpLabels::allocate_counter is used in 25/cii (<a href="25-cii.html#SP3_4_6">&#167;3.4.6</a>).</p>
<p class="endnote">The function JumpLabels::compile_necessary_storage is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function JumpLabels::compile_necessary_storage is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-lt.html">Back to 'List Together'</a></li><li><a href="26-ct.html">Continue with 'Compiled Text'</a></li></ul><hr class="tocbar">

View file

@ -70,7 +70,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure plugin_call is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure plugin_call is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>

View file

@ -11,7 +11,7 @@
<!--Weave of '26/pl' 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#26">Chapter 26: Compilation Utilities</a></li><li><b>Plugins</b></li></ul><p class="purpose">To manage the interface between core Inform and some of its outlying or domain-specific components.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Names of the great plugins</a></li><li><a href="#SP7">&#167;7. Plugins</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Names of the great plugins</a></li><li><a href="#SP7">&#167;7. Plugins</a></li><li><a href="#SP12">&#167;12. Describing the current VM</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
@ -238,7 +238,7 @@ present.
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::start is used in 1/mr (<a href="1-mr.html#SP4_7">&#167;4.7</a>).</p>
<p class="endnote">The function Plugins::Manage::start is used in 1/htc (<a href="1-htc.html#SP2_1">&#167;2.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Although most of Inform's brain remains the same, the outermost part can
be put together from whatever skills are required: our modular oblongata,
@ -332,11 +332,11 @@ with the following.
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::parse is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Plugins::Manage::parse appears nowhere else.</p>
<p class="endnote">The function Plugins::Manage::activate is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Plugins::Manage::activate appears nowhere else.</p>
<p class="endnote">The function Plugins::Manage::deactivate is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Plugins::Manage::deactivate appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue problem for trying to remove the core</span> <span class="cwebmacronumber">10.1</span>&gt; =
@ -367,7 +367,88 @@ with the following.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">start</span><span class="plain">) (*</span><span class="identifier">start</span><span class="plain">)();</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::start_plugins is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Describing the current VM. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Plugins::Manage::index_innards</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">VM</span><span class="plain">) {</span>
<span class="functiontext">Plugins::Manage::index_VM</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">VM</span><span class="plain">);</span>
<span class="functiontext">UseOptions::index</span><span class="plain">(</span><span class="identifier">OUT</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">Index::extra_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 3);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"See some technicalities for Inform maintainers only"</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="identifier">Index::extra_div_open</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 3, 2, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="functiontext">Plugins::Manage::show_configuration</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add some paste buttons for the debugging log</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
<span class="identifier">Index::extra_div_close</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::index_innards appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b>The index provides some hidden paste icons for these:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Add some paste buttons for the debugging log</span> <span class="cwebmacronumber">12.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">"Debugging log:"</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">NO_DEFINED_DA_VALUES</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">debugging_aspect</span><span class="plain"> *</span><span class="identifier">da</span><span class="plain"> = &amp;(</span><span class="identifier">the_debugging_aspects</span><span class="plain">[</span><span class="identifier">i</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">da</span><span class="plain">-&gt;</span><span class="identifier">unhyphenated_name</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">, </span><span class="string">"Include %S in the debugging log."</span><span class="plain">, </span><span class="identifier">da</span><span class="plain">-&gt;</span><span class="identifier">unhyphenated_name</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">is</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;%S"</span><span class="plain">, </span><span class="identifier">is</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</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></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Plugins::Manage::index_VM</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">VM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VM</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">"target VM not set yet"</span><span class="plain">);</span>
<span class="identifier">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"STORYFILE"</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">"Story file format: "</span><span class="plain">);</span>
<span class="identifier">Extensions::Census::plot_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">VM</span><span class="plain">);</span>
<span class="identifier">TargetVMs::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">VM</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::index_VM is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Plugins::Manage::show_configuration</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">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"CONFIG"</span><span class="plain">);</span>
@ -397,13 +478,11 @@ with the following.
<p class="inwebparagraph"></p>
<p class="endnote">The function Plugins::Manage::start_plugins is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Plugins::Manage::show_configuration is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">The function Plugins::Manage::show_configuration is used in 26/vm (<a href="26-vm.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Plugins::Manage::show appears nowhere else.</p>
<p class="endnote">The function Plugins::Manage::show is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Plugins::Manage::plugged_in is used in 1/mr (<a href="1-mr.html#SP4_7">&#167;4.7</a>, <a href="1-mr.html#SP4_17">&#167;4.17</a>), 5/ipw (<a href="5-ipw.html#SP2">&#167;2</a>), 9/rpt (<a href="9-rpt.html#SP9_5">&#167;9.5</a>), 16/ic (<a href="16-ic.html#SP15">&#167;15</a>), 21/rl (<a href="21-rl.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Plugins::Manage::plugged_in is used in 1/htc (<a href="1-htc.html#SP2_1">&#167;2.1</a>, <a href="1-htc.html#SP2_9">&#167;2.9</a>), 5/ipw (<a href="5-ipw.html#SP2">&#167;2</a>), 9/rpt (<a href="9-rpt.html#SP9_5">&#167;9.5</a>), 16/ic (<a href="16-ic.html#SP15">&#167;15</a>), 21/rl (<a href="21-rl.html#SP8">&#167;8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-iti.html">Back to 'I6 Template Interpreter'</a></li><li><a href="26-pc.html">Continue with 'Plugin Calls'</a></li></ul><hr class="tocbar">

View file

@ -28,7 +28,7 @@ already been set up, or not. Here's not:
<p class="inwebparagraph"></p>
<p class="endnote">The function Routines::begin is used in 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 5/nv (<a href="5-nv.html#SP16">&#167;16</a>), 6/bp (<a href="6-bp.html#SP33">&#167;33</a>), 6/rlt (<a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>, <a href="6-rlt.html#SP30">&#167;30</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP19">&#167;19</a>), 12/cdp (<a href="12-cdp.html#SP2_1">&#167;2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_4">&#167;24.4</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 15/ma (<a href="15-ma.html#SP13">&#167;13</a>), 17/tl (<a href="17-tl.html#SP14_2">&#167;14.2</a>), 17/ts (<a href="17-ts.html#SP11">&#167;11</a>), 17/rs (<a href="17-rs.html#SP6_1">&#167;6.1</a>, <a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 20/eq (<a href="20-eq.html#SP43">&#167;43</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>, <a href="21-rl.html#SP22_1">&#167;22.1</a>), 21/rb (<a href="21-rb.html#SP23">&#167;23</a>, <a href="21-rb.html#SP24_1_1">&#167;24.1.1</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 22/ph (<a href="22-ph.html#SP13">&#167;13</a>), 22/pav (<a href="22-pav.html#SP9_2">&#167;9.2</a>), 24/ch (<a href="24-ch.html#SP6">&#167;6</a>, <a href="24-ch.html#SP7">&#167;7</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>), 26/lt (<a href="26-lt.html#SP4_1">&#167;4.1</a>), 26/ts (<a href="26-ts.html#SP10">&#167;10</a>, <a href="26-ts.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Routines::begin is used in 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 5/nv (<a href="5-nv.html#SP16">&#167;16</a>), 6/bp (<a href="6-bp.html#SP33">&#167;33</a>), 6/rlt (<a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>, <a href="6-rlt.html#SP30">&#167;30</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP9">&#167;9</a>), 12/cdp (<a href="12-cdp.html#SP2_1">&#167;2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_4">&#167;24.4</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 15/ma (<a href="15-ma.html#SP13">&#167;13</a>), 17/tl (<a href="17-tl.html#SP14_2">&#167;14.2</a>), 17/ts (<a href="17-ts.html#SP11">&#167;11</a>), 17/rs (<a href="17-rs.html#SP6_1">&#167;6.1</a>, <a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 20/eq (<a href="20-eq.html#SP43">&#167;43</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>, <a href="21-rl.html#SP22_1">&#167;22.1</a>), 21/rb (<a href="21-rb.html#SP23">&#167;23</a>, <a href="21-rb.html#SP24_1_1">&#167;24.1.1</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 22/ph (<a href="22-ph.html#SP13">&#167;13</a>), 22/pav (<a href="22-pav.html#SP9_2">&#167;9.2</a>), 24/ch (<a href="24-ch.html#SP6">&#167;6</a>, <a href="24-ch.html#SP7">&#167;7</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>), 26/lt (<a href="26-lt.html#SP4_1">&#167;4.1</a>), 26/ts (<a href="26-ts.html#SP10">&#167;10</a>, <a href="26-ts.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>During the time when we're compiling the body of the routine,
we need to keep track of:
@ -113,7 +113,7 @@ did not.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">needed</span><span class="plain"> = </span><span class="functiontext">LocalVariables::count</span><span class="plain">(</span><span class="identifier">currently_compiling_in_frame</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kernel_name</span><span class="plain">) </span><span class="identifier">needed</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::allow_this_many_locals</span><span class="plain">(</span><span class="identifier">needed</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">TargetVMs::allow_this_many_locals</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">(), </span><span class="identifier">needed</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a problem for too many locals</span> <span class="cwebmacronumber">4.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">LocalVariables::declare</span><span class="plain">(</span><span class="identifier">currently_compiling_in_frame</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
@ -133,7 +133,7 @@ did not.
<p class="inwebparagraph"></p>
<p class="endnote">The function Routines::end is used in 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 5/nv (<a href="5-nv.html#SP16">&#167;16</a>), 6/bp (<a href="6-bp.html#SP33">&#167;33</a>), 6/rlt (<a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>, <a href="6-rlt.html#SP30">&#167;30</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP19">&#167;19</a>), 12/cdp (<a href="12-cdp.html#SP2_1">&#167;2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_4">&#167;24.4</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 15/ma (<a href="15-ma.html#SP13">&#167;13</a>), 17/tl (<a href="17-tl.html#SP14_2">&#167;14.2</a>), 17/ts (<a href="17-ts.html#SP11">&#167;11</a>), 17/rs (<a href="17-rs.html#SP6_1">&#167;6.1</a>, <a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 20/eq (<a href="20-eq.html#SP43">&#167;43</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>, <a href="21-rl.html#SP22_1">&#167;22.1</a>), 21/rb (<a href="21-rb.html#SP23">&#167;23</a>, <a href="21-rb.html#SP24_1_5">&#167;24.1.5</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 22/ph (<a href="22-ph.html#SP13">&#167;13</a>), 22/pav (<a href="22-pav.html#SP9_2">&#167;9.2</a>), 24/ch (<a href="24-ch.html#SP6">&#167;6</a>, <a href="24-ch.html#SP7">&#167;7</a>), 25/cp (<a href="25-cp.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>), 26/lt (<a href="26-lt.html#SP4_1">&#167;4.1</a>), 26/ts (<a href="26-ts.html#SP10">&#167;10</a>, <a href="26-ts.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Routines::end is used in 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/lp (<a href="5-lp.html#SP27">&#167;27</a>), 5/nv (<a href="5-nv.html#SP16">&#167;16</a>), 6/bp (<a href="6-bp.html#SP33">&#167;33</a>), 6/rlt (<a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>, <a href="6-rlt.html#SP30">&#167;30</a>), 6/nv (<a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a>), 8/ef (<a href="8-ef.html#SP9">&#167;9</a>), 12/cdp (<a href="12-cdp.html#SP2_1">&#167;2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_4">&#167;24.4</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a>), 15/ma (<a href="15-ma.html#SP13">&#167;13</a>), 17/tl (<a href="17-tl.html#SP14_2">&#167;14.2</a>), 17/ts (<a href="17-ts.html#SP11">&#167;11</a>), 17/rs (<a href="17-rs.html#SP6_1">&#167;6.1</a>, <a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a>), 19/tc (<a href="19-tc.html#SP8">&#167;8</a>), 19/rsft (<a href="19-rsft.html#SP2">&#167;2</a>), 20/eq (<a href="20-eq.html#SP43">&#167;43</a>), 21/rl (<a href="21-rl.html#SP20">&#167;20</a>, <a href="21-rl.html#SP22_1">&#167;22.1</a>), 21/rb (<a href="21-rb.html#SP23">&#167;23</a>, <a href="21-rb.html#SP24_1_5">&#167;24.1.5</a>), 21/rl2 (<a href="21-rl2.html#SP14_1">&#167;14.1</a>), 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 21/sv (<a href="21-sv.html#SP3">&#167;3</a>), 22/ph (<a href="22-ph.html#SP13">&#167;13</a>), 22/pav (<a href="22-pav.html#SP9_2">&#167;9.2</a>), 24/ch (<a href="24-ch.html#SP6">&#167;6</a>, <a href="24-ch.html#SP7">&#167;7</a>), 25/cp (<a href="25-cp.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a>), 26/lt (<a href="26-lt.html#SP4_1">&#167;4.1</a>), 26/ts (<a href="26-ts.html#SP10">&#167;10</a>, <a href="26-ts.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP4_1"></a><b>&#167;4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile an outer shell routine with the public-facing name</span> <span class="cwebmacronumber">4.1</span>&gt; =

View file

@ -43,7 +43,7 @@ attached.
<p class="inwebparagraph"></p>
<p class="endnote">The structure test_scenario is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 25/cp, 26/uo and here.</p>
<p class="endnote">The structure test_scenario is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 25/cp, 26/uo and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -531,11 +531,11 @@ without notice.
<p class="endnote">The function PL::Parsing::TestScripts::check_test_command is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="endnote">The function PL::Parsing::TestScripts::write_text is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::write_text is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_stub_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_stub_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
@ -628,7 +628,7 @@ without notice.
<span class="functiontext">Equations::internal_test</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VERB_INTT</span><span class="plain">:</span>
<span class="identifier">Conjugation::test</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="identifier">Conjugation::test</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ADJECTIVE_INTT</span><span class="plain">:</span>
<span class="identifier">Adjectives::test_adjective</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
@ -685,7 +685,7 @@ without notice.
<p class="endnote">The function PL::Parsing::TestScripts::new_internal is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function PL::Parsing::TestScripts::InternalTestCases_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::InternalTestCases_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::begin_internal_reporting is used in 20/eq (<a href="20-eq.html#SP52">&#167;52</a>).</p>

View file

@ -55,7 +55,7 @@ set a use option applying only to itself.
<p class="inwebparagraph"></p>
<p class="endnote">The structure use_option is accessed in 1/kts, 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/ts and here.</p>
<p class="endnote">The structure use_option is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Five of the pragma-like settings are stored here:
</p>
@ -348,11 +348,11 @@ there is no need to translate this to other languages.)
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;, 1);</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain"> = </span><span class="functiontext">UseOptions::parse_uo</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">uo</span><span class="plain">) {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="identifier">NULL</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">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Adjust the minimum setting</span> <span class="cwebmacronumber">11.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) {</span>
<span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</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">OW</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span> <span class="comment">that is, if used in the main source text</span>
<span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</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">OW</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="comment">that is, if used in the main source text</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="plain">}</span>
@ -376,7 +376,7 @@ there is no need to translate this to other languages.)
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">inter</span><span class="plain">-</span><span class="identifier">pipeline</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="functiontext">CoreMain::set_inter_pipeline</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="identifier">Inbuild::set_inter_pipeline</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
@ -450,7 +450,7 @@ there is no need to translate this to other languages.)
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::set_immediate_option_flags is used in <a href="#SP11_1">&#167;11.1</a>, 3/rst (<a href="3-rst.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function UseOptions::set_immediate_option_flags is used in <a href="#SP11_1">&#167;11.1</a>, 3/rst (<a href="3-rst.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Some use options need to acted on immediately &mdash; for instance, if they're
set in the "Options.txt" file and they affect how Inform parses subsequent
@ -484,11 +484,11 @@ those which need immediate action.
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">[1]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">AUTHORIAL_MODESTY_UO</span><span class="plain">: {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</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="functiontext">SourceFiles::get_extension_corresponding</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="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Extensions::Files::set_general_authorial_modesty</span><span class="plain">();</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Extensions::Files::set_authorial_modesty</span><span class="plain">(</span><span class="identifier">ef</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">Extensions::set_general_authorial_modesty</span><span class="plain">();</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Extensions::set_authorial_modesty</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DYNAMIC_MEMORY_ALLOCATION_UO</span><span class="plain">:</span>
@ -560,13 +560,13 @@ pragma is set:
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><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">category</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><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">category</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">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</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">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain">)))):</span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">efo</span><span class="plain"> = (</span><span class="identifier">sf</span><span class="plain">)?(</span><span class="functiontext">SourceFiles::get_extension_corresponding</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="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">efo</span><span class="plain"> = (</span><span class="identifier">sf</span><span class="plain">)?(</span><span class="functiontext">SourceFiles::get_extension_corresponding</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">switch</span><span class="plain"> (</span><span class="identifier">category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sf</span><span class="plain">) &amp;&amp; (</span><span class="identifier">efo</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">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </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">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sf</span><span class="plain">) &amp;&amp; (</span><span class="identifier">efo</span><span class="plain"> == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sf</span><span class="plain">) &amp;&amp; (</span><span class="identifier">efo</span><span class="plain"> == </span><span class="identifier">E</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -603,7 +603,7 @@ and problem messages must be issued.)
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::compile is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function UseOptions::compile is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>I6 memory settings need to be issued as ICL commands at the top of the I6
source code: see the DM4 for details.
@ -616,7 +616,7 @@ source code: see the DM4 for details.
<span class="reserved">i6_memory_setting</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ms</span><span class="plain">, </span><span class="reserved">i6_memory_setting</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"MAX_LOCAL_VARIABLES"</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">VirtualMachines::allow_MAX_LOCAL_VARIABLES</span><span class="plain">() == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="plain">(</span><span class="identifier">TargetVMs::allow_MAX_LOCAL_VARIABLES</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">, </span><span class="string">"$%S=%d"</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;number</span><span class="plain">);</span>
@ -628,7 +628,7 @@ source code: see the DM4 for details.
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::compile_icl_commands is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function UseOptions::compile_icl_commands is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>Now for indexing, where there's nothing much to see.
</p>
@ -645,8 +645,9 @@ source code: see the DM4 for details.
<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">"The following use options are in force:"</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">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">MAIN_TEXT_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">OPTIONS_FILE_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">) </span><span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">EXTENSION_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">ef</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">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="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">EXTENSION_UO_ORIGIN</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">nt</span><span class="plain"> = 0;</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</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>
@ -670,7 +671,7 @@ source code: see the DM4 for details.
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::index is used in 26/vm (<a href="26-vm.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function UseOptions::index is used in 26/pl (<a href="26-pl.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP19_1"></a><b>&#167;19.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write in the index line for a use option not taken</span> <span class="cwebmacronumber">19.1</span>&gt; =
@ -695,13 +696,13 @@ source code: see the DM4 for details.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::index_options_in_force_from</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">category</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::index_options_in_force_from</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">category</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">N</span><span class="plain"> = 0;</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</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">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</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">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &lt; 0) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">))) {</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</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="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">++ == 0) </span>&lt;<span class="cwebmacro">Write in the use option subheading</span> <span class="cwebmacronumber">20.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write in the index line for a use option taken</span> <span class="cwebmacronumber">20.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
@ -709,7 +710,7 @@ source code: see the DM4 for details.
<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">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</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">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">))) {</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</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="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">++ == 0) </span>&lt;<span class="cwebmacro">Write in the use option subheading</span> <span class="cwebmacronumber">20.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write in the index line for a use option taken</span> <span class="cwebmacronumber">20.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
@ -737,9 +738,9 @@ source code: see the DM4 for details.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the Options.txt configuration file"</span><span class="plain">);</span>
<span class="identifier">Index::DocReferences::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"OPTIONSFILE"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXTENSION_UO_ORIGIN</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the "</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">WRITE</span><span class="plain">(</span><span class="string">"the "</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">"the extension "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</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">title</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">);</span>
@ -793,7 +794,7 @@ one to test them, one to print them.
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::TestUseOption_routine is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function UseOptions::TestUseOption_routine is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile the TestUseOption routine</span> <span class="cwebmacronumber">21.1</span>&gt; =
@ -876,6 +877,16 @@ one to test them, one to print them.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_verb_verb_exists</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">story_author_given</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ranking_table_given</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scoring_option_set</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">; </span> <span class="comment">Whether in this case a score is kept at run time</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_deprecated_features</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">forbid syntaxes marked as deprecated?</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::no_verb_verb</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">no_verb_verb_exists</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -916,7 +927,7 @@ one to test them, one to print them.
<p class="endnote">The function UseOptions::ranking_table_given appears nowhere else.</p>
<p class="endnote">The function UseOptions::configure_template is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function UseOptions::configure_template is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-i6i.html">Back to 'Inform 6 Inclusions'</a></li><li><a href="26-lt.html">Continue with 'List Together'</a></li></ul><hr class="tocbar">

View file

@ -62,10 +62,9 @@ level-0 headings, which are the nodes from which these blocks of source text han
<span class="plain">}</span>
<span class="identifier">compilation_module</span><span class="plain"> *</span><span class="functiontext">Modules::new</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="reserved">extension_file</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">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">from</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">standard_rules_extension</span><span class="plain">;</span>
<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>
<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">internal_error</span><span class="plain">(</span><span class="string">"null foo"</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="functiontext">SourceFiles::get_extension_corresponding</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">from</span><span class="plain">))));</span>
<span class="identifier">compilation_module</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">Packaging::new_cm</span><span class="plain">();</span>
@ -79,15 +78,16 @@ level-0 headings, which are the nodes from which these blocks of source text han
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner</span><span class="plain">) {</span>
<span class="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">inter_presence</span><span class="plain">-&gt;</span><span class="identifier">the_package</span><span class="plain">, </span><span class="constant">EXT_AUTHOR_HMD</span><span class="plain">, </span><span class="identifier">owner</span><span class="plain">-</span><span class="element">&gt;ef_id.raw_author_name</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">inter_presence</span><span class="plain">-&gt;</span><span class="identifier">the_package</span><span class="plain">, </span><span class="constant">EXT_TITLE_HMD</span><span class="plain">, </span><span class="identifier">owner</span><span class="plain">-</span><span class="element">&gt;ef_id.raw_title</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">inter_presence</span><span class="plain">-&gt;</span><span class="identifier">the_package</span><span class="plain">, </span><span class="constant">EXT_AUTHOR_HMD</span><span class="plain">, </span><span class="identifier">owner</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="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">inter_presence</span><span class="plain">-&gt;</span><span class="identifier">the_package</span><span class="plain">, </span><span class="constant">EXT_TITLE_HMD</span><span class="plain">, </span><span class="identifier">owner</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">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain">));</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">owner</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_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="string">"%v"</span><span class="plain">, &amp;</span><span class="identifier">N</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">inter_presence</span><span class="plain">-&gt;</span><span class="identifier">the_package</span><span class="plain">, </span><span class="constant">EXT_VERSION_HMD</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<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">standard_rules_extension</span><span class="plain">) </span><span class="identifier">SR_module</span><span class="plain"> = </span><span class="identifier">C</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">owner</span><span class="plain">)) </span><span class="identifier">SR_module</span><span class="plain"> = </span><span class="identifier">C</span><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">NULL</span><span class="plain">) </span><span class="identifier">source_text_module</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -95,7 +95,7 @@ level-0 headings, which are the nodes from which these blocks of source text han
<p class="inwebparagraph"></p>
<p class="endnote">The function Modules::traverse_to_define is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Modules::traverse_to_define is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Modules::look_for_cu appears nowhere else.</p>
@ -112,10 +112,10 @@ compiled from the compilation module will go into a package of that name.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="string">"standard_rules"</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">owner</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="string">"standard_rules"</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">owner</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="string">"source_text"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="string">"%X"</span><span class="plain">, </span><span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="string">"%X"</span><span class="plain">, </span><span class="identifier">owner</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">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">pname</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">' '</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="character">'_'</span><span class="plain">);</span>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -11,320 +11,79 @@
<!--Weave of '3/nl' 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#3">Chapter 3: Bridge to Words Module</a></li><li><b>Natural Languages</b></li></ul><p class="purpose">To manage definitions of natural languages, such as English or French, which may be used either to write Inform or to read the works it compiles.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP7">&#167;7. The bundle scan</a></li><li><a href="#SP10">&#167;10. Finding by name</a></li><li><a href="#SP11">&#167;11. Logging</a></li><li><a href="#SP12">&#167;12. Naming</a></li><li><a href="#SP13">&#167;13. Parsing</a></li><li><a href="#SP14">&#167;14. The natural language kind</a></li><li><a href="#SP15">&#167;15. The adaptive person</a></li><li><a href="#SP16">&#167;16. Choice of languages</a></li><li><a href="#SP17">&#167;17. Language code</a></li><li><a href="#SP18">&#167;18. Including language extensions</a></li><li><a href="#SP19">&#167;19. Including Preform syntax</a></li><li><a href="#SP20">&#167;20. Preform error handling</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. The bundle scan</a></li><li><a href="#SP2">&#167;2. Language of play</a></li><li><a href="#SP3">&#167;3. Indexing</a></li><li><a href="#SP5">&#167;5. Parsing</a></li><li><a href="#SP6">&#167;6. The natural language kind</a></li><li><a href="#SP7">&#167;7. The adaptive person</a></li><li><a href="#SP8">&#167;8. Including Preform syntax</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Inform can read and write text in multiple natural languages, though it
needs help to do so. Each natural language known to Inform comes from a
small resource folder called its "bundle", and also has an extension
associated with it: this includes English. Bundles for common languages
are included as part of the default distribution for Inform, but the
extension is only included for English.
</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Within the bundle folder is a file called <code class="display"><span class="extract">about.txt</span></code>, which sets numbered
fields to excerpts of text. The following are the field numbers:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NAME_IN_ENGLISH_LFIELD</span><span class="plain"> 1 </span> <span class="comment">e.g. "German"</span>
<span class="definitionkeyword">define</span> <span class="constant">NAME_NATIVE_LFIELD</span><span class="plain"> 2 </span> <span class="comment">e.g. "Deutsch"</span>
<span class="definitionkeyword">define</span> <span class="constant">CUE_NATIVE_LFIELD</span><span class="plain"> 3 </span> <span class="comment">e.g. "in deutscher Sprache"</span>
<span class="definitionkeyword">define</span> <span class="constant">ISO_639_CODE_LFIELD</span><span class="plain"> 4 </span> <span class="comment">e.g. "de": an ISO 639-1 code</span>
<span class="definitionkeyword">define</span> <span class="constant">TRANSLATOR_LFIELD</span><span class="plain"> 5 </span> <span class="comment">e.g. "Team GerX"</span>
<span class="definitionkeyword">define</span> <span class="constant">KIT_LFIELD</span><span class="plain"> 6 </span> <span class="comment">e.g. "GermanLanguageKit"</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_LANGUAGE_FIELDS</span><span class="plain"> 7 </span> <span class="comment">one more than the highest number above</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Each natural language whose bundle can be located generates an instance
of the following structure.
</p>
<p class="inwebparagraph">Note that each NL automatically defines an instance of the kind "natural
language". For timing reasons, we first store the name of this instance &mdash;
say, "German language" &mdash; and only later create the instance.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">natural_language</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">nl_bundle_path</span><span class="plain">; </span> <span class="comment">pathname of the bundle folder</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">instance_name</span><span class="plain">; </span> <span class="comment">instance name, e.g., "German language"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">nl_instance</span><span class="plain">; </span> <span class="comment">instance, e.g., "German language"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">language_field</span><span class="plain">[</span><span class="constant">MAX_LANGUAGE_FIELDS</span><span class="plain">]; </span> <span class="comment">contents of the <code class="display"><span class="extract">about.txt</span></code> fields</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kit_required</span><span class="plain">; </span> <span class="comment">do we need to load a kit for this language?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">adaptive_person</span><span class="plain">; </span> <span class="comment">which person (one of constants below) text subs are written from</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">natural_language</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure natural_language is accessed in 1/mr and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The following defaults to English in practice:
</p>
<pre class="display">
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">language_of_play</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">the language read and typed by the player</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NATURAL_LANGUAGES_PRESENT</span>
</pre>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. The bundle scan. </b>Early in Inform's run we scan for installed language bundle folders. This is
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The bundle scan. </b>Early in Inform's run we scan for installed language bundle folders. This is
done on demand (i.e., when we need to know something about languages). We
only want to do it once, and we must prevent it recursing:
only want to do it once, and we must prevent it recursing.
</p>
<p class="inwebparagraph">To carry out the scan it's sufficient to ask Inbuild to generate a list of
results, because the language bundles will be scanned as they are found. We
can simply discard the search results.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bundle_scan_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">language_scan_top</span><span class="plain"> = -1;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::scan</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bundle_scan_made</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">bundle_scan_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform the bundle scan</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Process the bundles scanned in</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="identifier">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="identifier">Requirements::anything_of_genre</span><span class="plain">(</span><span class="identifier">language_genre</span><span class="plain">);</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">inbuild_search_result</span><span class="plain">);</span>
<span class="identifier">Nests::search_for</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">language_scan_top</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain"> - 1;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::scan is used in <a href="#SP10">&#167;10</a>, 4/its (<a href="4-its.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function NaturalLanguages::scan is used in <a href="#SP2">&#167;2</a>, 4/its (<a href="4-its.html#SP7">&#167;7</a>), 8/ie (<a href="8-ie.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>The rules for these are exactly the same as for extensions, or website
templates, so for example the materials folder takes priority. If we find
a bundle with the same name twice (e.g., if we find "German" in two
different locations), the first to be found wins out.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Perform the bundle scan</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="constant">NO_FS_AREAS</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++)</span>
<span class="functiontext">NaturalLanguages::scan_bundles_from</span><span class="plain">(</span><span class="identifier">pathname_of_languages</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">], </span><span class="identifier">AREA_NAME</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">]);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The following rather crudely loads a directory listing for the pathname
into a scratch string, then cuts it up into individual names.
</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Language of play. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::scan_bundles_from</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">origin</span><span class="plain">) {</span>
<span class="identifier">scan_directory</span><span class="plain"> *</span><span class="identifier">sd</span><span class="plain"> = </span><span class="identifier">Directories::open</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sd</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">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">item</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Directories::next</span><span class="plain">(</span><span class="identifier">sd</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Act on an item in the bundle listing</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">item</span><span class="plain">);</span>
<span class="identifier">Directories::close</span><span class="plain">(</span><span class="identifier">sd</span><span class="plain">);</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="functiontext">NaturalLanguages::English</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">NaturalLanguages::scan</span><span class="plain">();</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Languages::from_name</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"english"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</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">"unable to find English language bundle"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::scan_bundles_from is used in <a href="#SP7_1">&#167;7.1</a>.</p>
<p class="endnote">The function NaturalLanguages::English is used in 1/wtc (<a href="1-wtc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>We expect each such folder to contain only names of bundles, each of which
should be a single English word, without accents.
</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Indexing. </b></p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Act on an item in the bundle listing</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">acceptable</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &lt; 32) || (</span><span class="identifier">c</span><span class="plain"> &gt; 126)) </span><span class="identifier">acceptable</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">contains non-ASCII</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">) { </span><span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, 0); </span><span class="reserved">break</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">item</span><span class="plain">) == 0) </span><span class="identifier">acceptable</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">i.e., an empty text</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">acceptable</span><span class="plain">) {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = </span><span class="functiontext">NaturalLanguages::get_nl</span><span class="plain">(</span><span class="identifier">item</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Create a new natural language structure</span> <span class="cwebmacronumber">8.1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_bundle_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Found language bundle '%S' (%s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">origin</span><span class="plain">);</span>
<span class="plain">}</span>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::produce_index</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">Task::project</span><span class="plain">();</span>
<span class="functiontext">I6T::interpret_indext</span><span class="plain">(</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Languages::path_to_bundle</span><span class="plain">(</span>
<span class="identifier">Projects::get_language_of_index</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">)),</span>
<span class="identifier">Projects::index_template</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">)));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">The function NaturalLanguages::produce_index is used in 1/htc (<a href="1-htc.html#SP2_9">&#167;2.9</a>).</p>
<p class="inwebparagraph"><a id="SP8_1_1"></a><b>&#167;8.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create a new natural language structure</span> <span class="cwebmacronumber">8.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">sentence_format</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">sentence_format</span><span class="plain">, </span><span class="string">"%S language"</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">);</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;instance_name</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">sentence_format</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">sentence_format</span><span class="plain">);</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_instance</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;kit_required</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;adaptive_person</span><span class="plain"> = -1; </span> <span class="comment">i.e., none yet specified</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">=0; </span><span class="identifier">n</span><span class="plain">&lt;</span><span class="constant">MAX_LANGUAGE_FIELDS</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">++) </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">] = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>At this point, the bundle scan is over. For each bundle we've found, we
read in the <code class="display"><span class="extract">about.txt</span></code> file and extract the excerpts.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Process the bundles scanned in</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Read the about.txt file for the bundle</span> <span class="cwebmacronumber">7.2.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_1"></a><b>&#167;7.2.1. </b>If we can't find the file, it doesn't matter except that all of the excerpts
remain empty. But we may as well tell the debugging log.
</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_BUNDLE_ABOUT_LINE_LENGTH</span><span class="plain"> 256 </span> <span class="comment">which is far more than necessary, really</span>
<span class="definitionkeyword">define</span> <span class="constant">NATURAL_LANGUAGES_PRESENT</span>
</pre>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the about.txt file for the bundle</span> <span class="cwebmacronumber">7.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">about_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_bundle_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"about.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">about_file</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">FALSE</span><span class="plain">, </span><span class="functiontext">NaturalLanguages::about_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Can't find about file: %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">about_file</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2">&#167;7.2</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>The format of the file is very simple. Each line is introduced by a number
from 1 to <code class="display"><span class="extract">MAX_LANGUAGE_FIELDS</span></code> minus one, and then contains text which
extends for the rest of the line.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::about_helper</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">item_name</span><span class="plain">,</span>
<span class="identifier">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vnl</span><span class="plain">) {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = (</span><span class="reserved">natural_language</span><span class="plain"> *) </span><span class="identifier">vnl</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">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">item_name</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">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">Lexer::word</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="reserved">int</span><span class="plain"> </span><span class="identifier">field</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ve</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Vocabulary::test_vflags</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">NUMBER_MC</span><span class="plain">)))</span>
<span class="identifier">field</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_literal_number_value</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">field</span><span class="plain"> &gt;= 1) &amp;&amp; (</span><span class="identifier">field</span><span class="plain"> &lt; </span><span class="constant">MAX_LANGUAGE_FIELDS</span><span class="plain">)) {</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="identifier">field</span><span class="plain">] =</span>
<span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)+1, </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Warning: couldn't read about.txt line: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">item_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::about_helper is used in <a href="#SP7_2_1">&#167;7.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Finding by name. </b>Given the name of a natural language (e.g., "German") we find the
corresponding structure, if it exists. We perform this check case
insensitively.
</p>
<pre class="display">
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="functiontext">NaturalLanguages::get_nl</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="functiontext">NaturalLanguages::scan</span><span class="plain">();</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">lname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lname</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;instance_name</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">lname</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">lname</span><span class="plain">);</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::get_nl is used in <a href="#SP8_1">&#167;8.1</a>, <a href="#SP16">&#167;16</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Logging. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::log</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;null-language&gt;"</span><span class="plain">); }</span>
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="functiontext">NaturalLanguages::get_name</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">)); }</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Naming. </b></p>
<pre class="display">
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::get_name</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">English_language</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;instance_name</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::get_name is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Parsing. </b>The following matches the English-language name of a language: for example,
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Parsing. </b>The following matches the English-language name of a language: for example,
"French". It will only make a match if Inform has successfully found a
bundle for that language during its initial scan.
</p>
@ -332,10 +91,10 @@ bundle for that language during its initial scan.
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">natural</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;instance_name</span><span class="plain">))) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">inform_language</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">instance_name</span><span class="plain">))) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -343,7 +102,7 @@ bundle for that language during its initial scan.
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. The natural language kind. </b>Inform has a kind built in called "natural language", whose values are
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. The natural language kind. </b>Inform has a kind built in called "natural language", whose values are
enumerated names: English language, French language, German language and so on.
When the kind is created, the following routine makes these instances. We do
this exactly as we would to create any other instance &mdash; we write a logical
@ -356,12 +115,12 @@ in German; but this is how we'll do it, anyway.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::stock_nl_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="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">) {</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">inform_language</span><span class="plain">) {</span>
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> =</span>
<span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;instance_name</span><span class="plain">);</span>
<span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">instance_name</span><span class="plain">);</span>
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_instance</span><span class="plain"> = </span><span class="identifier">latest_instance</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">nl_instance</span><span class="plain"> = </span><span class="identifier">latest_instance</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
@ -370,7 +129,7 @@ in German; but this is how we'll do it, anyway.
<p class="endnote">The function NaturalLanguages::stock_nl_kind appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. The adaptive person. </b>The following is only relevant for the language of play, whose extension will
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. The adaptive person. </b>The following is only relevant for the language of play, whose extension will
always be read in. That in turn is expected to contain a declaration like
this one:
</p>
@ -386,21 +145,21 @@ this because we need access to it very quickly when parsing text substitutions.)
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::adaptive_person</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::adaptive_person</span><span class="plain">(</span><span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</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">nl</span><span class="plain">-</span><span class="element">&gt;adaptive_person</span><span class="plain"> == -1) &amp;&amp; (</span><span class="identifier">P_adaptive_text_viewpoint</span><span class="plain">)) {</span>
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_instance</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">adaptive_person</span><span class="plain"> == -1) &amp;&amp; (</span><span class="identifier">P_adaptive_text_viewpoint</span><span class="plain">)) {</span>
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">nl_instance</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="functiontext">World::Inferences::get_prop_state</span><span class="plain">(</span>
<span class="functiontext">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">P_adaptive_text_viewpoint</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">)) {</span>
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_instance</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;adaptive_person</span><span class="plain"> = </span><span class="functiontext">Instances::get_numerical_value</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)-1;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">adaptive_person</span><span class="plain"> = </span><span class="functiontext">Instances::get_numerical_value</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)-1;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;adaptive_person</span><span class="plain"> == -1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FIRST_PERSON_PLURAL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;adaptive_person</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">adaptive_person</span><span class="plain"> == -1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FIRST_PERSON_PLURAL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">adaptive_person</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -408,94 +167,15 @@ this because we need access to it very quickly when parsing text substitutions.)
<p class="endnote">The function NaturalLanguages::adaptive_person appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Choice of languages. </b></p>
<pre class="display">
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="functiontext">NaturalLanguages::English</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = </span><span class="functiontext">NaturalLanguages::get_nl</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"english"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</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">"unable to find English language bundle"</span><span class="plain">);</span>
<span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;kit_required</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">English_language</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">nl</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::set_language_of_play</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="identifier">language_of_play</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain">) </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;kit_required</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::English is used in 1/mr (<a href="1-mr.html#SP4_17">&#167;4.17</a>), 4/its (<a href="4-its.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function NaturalLanguages::set_language_of_play appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. Language code. </b>This is used when we write the bibliographic data for the work of IF we're
making; this enables online databases like IFDB, and smart interpreters, to
detect the language of play for a story file without actually running it.
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Including Preform syntax. </b>At present we do this only for English, but some day...
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::write_language_code</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">English_language</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">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="constant">ISO_639_CODE_LFIELD</span><span class="plain">]))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="constant">ISO_639_CODE_LFIELD</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">"en"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::write_language_code appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Including language extensions. </b>Most extensions are included with explicit Inform source text:
</p>
<blockquote>
<p>Include Locksmith by Emily Short.</p>
</blockquote>
<p class="inwebparagraph">But the Standard Rules are an exception &mdash; they're always included &mdash; and so
are the languages used in the source text and for play. Note that French
games, say, involve loading two language extensions: English Language, because
that's the language in which the SR are written, and French Language, because
that's the language of play.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::request_required_kits</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;kit_required</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</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">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="constant">KIT_LFIELD</span><span class="plain">]))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="constant">KIT_LFIELD</span><span class="plain">]);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%+WLanguageKit"</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;language_field</span><span class="plain">[</span><span class="constant">NAME_IN_ENGLISH_LFIELD</span><span class="plain">]);</span>
<span class="functiontext">Kits::request</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function NaturalLanguages::request_required_kits is used in 1/kts (<a href="1-kts.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Including Preform syntax. </b>At present we do this only for English, but some day...
</p>
<pre class="display">
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::load_preform</span><span class="plain">(</span><span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</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">"can't load preform from null language"</span><span class="plain">);</span>
<span class="identifier">language_being_read_by_Preform</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">preform_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">-</span><span class="element">&gt;nl_bundle_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Syntax.preform"</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::load_preform</span><span class="plain">(</span><span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</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">"can't load preform from null language"</span><span class="plain">);</span>
<span class="identifier">language_being_read_by_Preform</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">preform_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Languages::path_to_bundle</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"Syntax.preform"</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Reading language definition from &lt;%f&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">preform_file</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Preform::load_from_file</span><span class="plain">(</span><span class="identifier">preform_file</span><span class="plain">);</span>
<span class="plain">}</span>
@ -505,7 +185,8 @@ that's the language of play.
<p class="endnote">The function NaturalLanguages::load_preform is used in 4/its (<a href="4-its.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. Preform error handling. </b></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Preform errors are handled here:
</p>
<pre class="display">

View file

@ -24,44 +24,156 @@ inclusion sentences &mdash; see Kits.
<pre class="display">
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">primary_source_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">first to be opened</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>There is no real difference between the loading of the primary source text
and the loading of an extension's text, except for the descriptions we
supply in case of any problem messages which might need to be issued,
and for the fact that the mandatory insertion text is loaded before the
primary source text.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_extension_source_text</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">EF</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">synopsis</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">documentation_only</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">SourceFiles::read_file</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">, </span><span class="identifier">documentation_only</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="identifier">LEXICAL_OUTPUT_DA</span><span class="plain">)) </span><span class="identifier">Word::log_lexer_output</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::read</span><span class="plain">(</span><span class="identifier">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">Copies::read_source_text_for</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">SourceFiles::issue_problems_arising</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_primary_source_text</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">early</span><span class="plain">);</span>
<span class="functiontext">Kits::feed_early_source_text</span><span class="plain">(</span><span class="identifier">early</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">early</span><span class="plain">) &gt; 0) </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">early</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">early</span><span class="plain">);</span>
<span class="functiontext">SourceFiles::read_further_mandatory_text</span><span class="plain">();</span>
<span class="functiontext">SourceFiles::read_file</span><span class="plain">(</span><span class="identifier">filename_of_i7_source</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"your source text"</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="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::issue_problems_arising</span><span class="plain">(</span><span class="identifier">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</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">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">copy_error</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">errors_reading_source_text</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">error_category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OPEN_FAILED_CE</span><span class="plain">:</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(1, </span><span class="identifier">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">file</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">Untestable</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I can't open the file '%1' of source text. %P"</span>
<span class="string">"If you are using the 'Source' subfolder of Materials to "</span>
<span class="string">"hold your source text, maybe your 'Contents.txt' has a "</span>
<span class="string">"typo in it?"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXT_MISWORDED_CE</span><span class="plain">:</span>
<span class="functiontext">Problems::quote_work</span><span class="plain">(1, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">-&gt;</span><span class="identifier">found_by</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(2, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">notes</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">PM_ExtMiswordedBeginsHere</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, seems to be "</span>
<span class="string">"damaged or incorrect: its identifying opening line is wrong. "</span>
<span class="string">"Specifically, %2."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">KIT_MISWORDED_CE</span><span class="plain">:</span>
<span class="functiontext">Problems::quote_work</span><span class="plain">(1, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">-&gt;</span><span class="identifier">found_by</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(2, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">notes</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">Untestable</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The kit %1, which your source text makes use of, seems to be "</span>
<span class="string">"damaged or incorrect: its identifying opening line is wrong. "</span>
<span class="string">"Specifically, %2."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXT_TITLE_TOO_LONG_CE</span><span class="plain">: {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain"> = </span><span class="identifier">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">overage</span><span class="plain"> = </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">details_N</span><span class="plain"> - </span><span class="identifier">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">;</span>
<span class="functiontext">Problems::quote_work</span><span class="plain">(1, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">-&gt;</span><span class="identifier">found_by</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">Problems::quote_number</span><span class="plain">(2, &amp;</span><span class="identifier">max</span><span class="plain">);</span>
<span class="identifier">Problems::quote_number</span><span class="plain">(3, &amp;</span><span class="identifier">overage</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">PM_ExtTitleTooLong</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, has a "</span>
<span class="string">"title which is too long, exceeding the maximum allowed "</span>
<span class="string">"(%2 characters) by %3."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXT_AUTHOR_TOO_LONG_CE</span><span class="plain">: {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain"> = </span><span class="identifier">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">overage</span><span class="plain"> = </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">details_N</span><span class="plain"> - </span><span class="identifier">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">;</span>
<span class="functiontext">Problems::quote_work</span><span class="plain">(1, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">-&gt;</span><span class="identifier">found_by</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">Problems::quote_number</span><span class="plain">(2, &amp;</span><span class="identifier">max</span><span class="plain">);</span>
<span class="identifier">Problems::quote_number</span><span class="plain">(3, &amp;</span><span class="identifier">overage</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">PM_ExtAuthorTooLong</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, has an "</span>
<span class="string">"author name which is too long, exceeding the maximum allowed "</span>
<span class="string">"(%2 characters) by %3."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LEXER_CE</span><span class="plain">:</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">error_subcategory</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STRING_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TooMuchQuotedText</span><span class="plain">),</span>
<span class="string">"Too much text in quotation marks"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"...\</span><span class="plain">"</span><span class="string"> The maximum length is very high, so this is more "</span>
<span class="string">"likely to be because a close quotation mark was "</span>
<span class="string">"forgotten."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">WORD_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_WordTooLong</span><span class="plain">),</span>
<span class="string">"Word too long"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"(Individual words of unquoted text can run up to "</span>
<span class="string">"128 letters long, which ought to be plenty. The longest "</span>
<span class="string">"recognised place name in the English speaking world is "</span>
<span class="string">"a hill in New Zealand called Taumatawhakatang-"</span>
<span class="string">"ihangakoauauot-amateaturipukaka-pikimaunga-"</span>
<span class="string">"horonuku-pokaiwhenuak-itanatahu. (You say tomato, "</span>
<span class="string">"I say taumatawhakatang-...) The longest word found in a "</span>
<span class="string">"classic novel is bababadalgharaghtakamminarronnkonnbronntonn"</span>
<span class="string">"erronntuonnthunntrovarrhounawnskawntoohoohoordenenthurnuk, "</span>
<span class="string">"creation's thunderclap from Finnegan's Wake. And both of those "</span>
<span class="string">"words are fine.)"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">I6_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">), </span> <span class="comment">well, not at all conveniently</span>
<span class="string">"Verbatim Inform 6 extract too long"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"... -). The maximum length is quite high, so this "</span>
<span class="string">"may be because a '-)' was forgotten. Still, if "</span>
<span class="string">"you do need to paste a huge I6 program in, try "</span>
<span class="string">"using several verbatim inclusions in a row."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STRING_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingQuote</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of quoted text"</span><span class="plain">,</span>
<span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">details</span><span class="plain">,</span>
<span class="string">"This probably means that a quotation mark is missing "</span>
<span class="string">"somewhere. If you are using Inform with syntax colouring, "</span>
<span class="string">"look for where the quoted-text colour starts. (Sometimes "</span>
<span class="string">"this problem turns up because a piece of quoted text contains "</span>
<span class="string">"a text substitution in square brackets which in turn contains "</span>
<span class="string">"another piece of quoted text - this is not allowed, and causes "</span>
<span class="string">"me to lose track.)"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">COMMENT_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingComment</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of a comment"</span><span class="plain">,</span>
<span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">details</span><span class="plain">,</span>
<span class="string">"This probably means that a ']' is missing somewhere. "</span>
<span class="string">"(If you are using Inform with syntax colouring, look for "</span>
<span class="string">"where the comment colour starts.) Inform's convention on "</span>
<span class="string">"'nested comments' is that each '[' in a comment must be "</span>
<span class="string">"matched by a corresponding ']': so for instance '[This "</span>
<span class="string">"[even nested like so] acts as a comment]' is a single "</span>
<span class="string">"comment - the first ']' character matches the second '[' "</span>
<span class="string">"and so doesn't end the comment: only the second ']' ends "</span>
<span class="string">"the comment."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">I6_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingI6</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of a verbatim passage "</span>
<span class="string">"of Inform 6 code"</span><span class="plain">,</span>
<span class="identifier">CE</span><span class="plain">-&gt;</span><span class="identifier">details</span><span class="plain">,</span>
<span class="string">"This probably means that a '-)' is missing."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown lexer error"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"an unknown error occurred"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceFiles::read_extension_source_text is used in 8/ie (<a href="8-ie.html#SP5_2">&#167;5.2</a>).</p>
<p class="endnote">The function SourceFiles::read is used in 1/htc (<a href="1-htc.html#SP2_2">&#167;2.2</a>), 8/ie (<a href="8-ie.html#SP5_2">&#167;5.2</a>).</p>
<p class="endnote">The function SourceFiles::read_primary_source_text is used in 1/mr (<a href="1-mr.html#SP4_9">&#167;4.9</a>).</p>
<p class="endnote">The function SourceFiles::issue_problems_arising is used in 8/ie (<a href="8-ie.html#SP5_2">&#167;5.2</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following reads in the text of the optional file of use options, if
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following reads in the text of the optional file of use options, if
this has been created, producing no problem message if it hasn't.
</p>
@ -72,9 +184,9 @@ this has been created, producing no problem message if it hasn't.
<pre class="display">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">options_file_wording</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING_INIT</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_further_mandatory_text</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_further_mandatory_text</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">filename_of_options</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">,</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">TRUE</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="functiontext">SourceFiles::read_further_mandatory_text_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">options_file_wording</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="plain">}</span>
@ -90,287 +202,25 @@ this has been created, producing no problem message if it hasn't.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::within</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">options_file_wording</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="functiontext">SourceFiles::get_extension_corresponding</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="identifier">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>
<span class="reserved">if</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="identifier">work</span><span class="plain">-&gt;</span><span class="identifier">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>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">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 SourceFiles::read_further_mandatory_text is used in <a href="#SP3">&#167;3</a>.</p>
<p class="endnote">The function SourceFiles::read_further_mandatory_text appears nowhere else.</p>
<p class="endnote">The function SourceFiles::read_further_mandatory_text_helper appears nowhere else.</p>
<p class="endnote">The function SourceFiles::increase_sentence_count appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Either way, we use the following code. The <code class="display"><span class="extract">SourceFiles::read_file</span></code> function returns
one of the following values to indicate the source of the source: the value
only really tells us something we didn't know in the case of extensions,
but in that event the Extensions.w routines do indeed want to know this.
(Area 51 is reserved for extensions of alien origin, but the relevant
source code is classified.)
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">ORIGIN_WAS_PRIMARY_SOURCE</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA</span><span class="plain"> 1 </span> <span class="comment">must match <code class="display"><span class="extract">*_FS_AREA</span></code> numbers plus 1</span>
<span class="definitionkeyword">define</span> <span class="constant">ORIGIN_WAS_USER_EXTENSIONS_AREA</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA</span><span class="plain"> 3</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_file</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">synopsis</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">EF</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">documentation_only</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="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EF</span><span class="plain">)</span>
<span class="identifier">area</span><span class="plain"> = </span><span class="functiontext">SourceFiles::read_file_inner</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">pathname_of_extensions</span><span class="plain">, </span><span class="constant">NO_FS_AREAS</span><span class="plain"> + 1, </span><span class="identifier">documentation_only</span><span class="plain">, &amp;</span><span class="identifier">sf</span><span class="plain">,</span>
<span class="identifier">STORE_POINTER_extension_file</span><span class="plain">(</span><span class="identifier">EF</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">area</span><span class="plain"> = </span><span class="functiontext">SourceFiles::read_file_inner</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">NULL</span><span class="plain">, 0, </span><span class="identifier">documentation_only</span><span class="plain">, &amp;</span><span class="identifier">sf</span><span class="plain">,</span>
<span class="identifier">STORE_POINTER_extension_file</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">area</span><span class="plain"> == -1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EF</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Author: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">-</span><span class="element">&gt;author_text</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Title: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(2, </span><span class="identifier">synopsis</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">PM_BogusExtension</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I can't find the extension '%2', which seems not to be installed, "</span>
<span class="string">"but was requested by: %1. %P"</span>
<span class="string">"You can get hold of extensions which people have made public at "</span>
<span class="string">"the Inform website, www.inform7.com, or by using the Public "</span>
<span class="string">"Library in the Extensions panel."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span>
<span class="string">"Error: can't open source text file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</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">EF</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">primary_source_file</span><span class="plain"> = </span><span class="identifier">sf</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Extensions::Files::set_corresponding_source_file</span><span class="plain">(</span><span class="identifier">EF</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">documentation_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Tell console output about the file</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceFiles::read_file is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>This is where messages like
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">I've also read Standard Rules by Graham Nelson, which is 27204 words long.</span>
</pre>
<p class="inwebparagraph">are printed to <code class="display"><span class="extract">stdout</span></code> (not <code class="display"><span class="extract">stderr</span></code>), in something of an affectionate nod
to TeX's traditional console output, though occasionally I think silence is
golden and that the messages could go. It's a moot point for almost all users,
though, because the console output is concealed from them by the Inform
application.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Tell console output about the file</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wc</span><span class="plain">;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EF</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">message</span><span class="plain"> = </span><span class="string">"I've now read %S, which is %d words long.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">message</span><span class="plain"> = </span><span class="string">"I've also read %S, which is %d words long.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">;</span>
<span class="identifier">wc</span><span class="plain"> = </span><span class="identifier">TextFromFiles::total_word_count</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">wc</span><span class="plain">);</span>
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">wc</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SourceFiles::read_file_inner</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">synopsis</span><span class="plain">,</span>
<span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">list</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">list_len</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">documentation_only</span><span class="plain">, </span><span class="identifier">source_file</span><span class="plain"> **</span><span class="identifier">S</span><span class="plain">,</span>
<span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">ref</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">primary</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">EF</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">origin_tried</span><span class="plain"> = 1;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">handle</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">eventual</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Set pathname and filename, and open file</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handle</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leaf</span><span class="plain"> = </span><span class="identifier">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">eventual</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">primary</span><span class="plain">) </span><span class="identifier">leaf</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"main source text"</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="identifier">TextFromFiles::feed_open_file_into_lexer</span><span class="plain">(</span><span class="identifier">eventual</span><span class="plain">, </span><span class="identifier">handle</span><span class="plain">,</span>
<span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">documentation_only</span><span class="plain">, </span><span class="identifier">ref</span><span class="plain">);</span>
<span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">handle</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">S</span><span class="plain"> = </span><span class="identifier">sf</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">origin_tried</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceFiles::read_file_inner is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>The primary source text must be found where we expect it, or a fatal
error is issued. An extension, however, can be in one of two places: the
user's own repository of installed extensions, or the built-in stock. We
must try each possibility &mdash; in that order, so that the user can supplant
the built-in extensions by installing hacked versions of her own &mdash; and in
the event of failing, we issue only a standard Inform problem message and
continue. While meaningful compilation is unlikely to succeed now, this is
not a fatal error, because fatality would cause the user interface
application to communicate the problem badly.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set pathname and filename, and open file</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">handle</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">author_name</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">author_name</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">-</span><span class="element">&gt;author_text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">EF</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="identifier">list_len</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handle</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">list</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">];</span>
<span class="identifier">origin_tried</span><span class="plain"> = </span><span class="identifier">area</span><span class="plain"> + 1;</span>
<span class="identifier">eventual</span><span class="plain"> = </span><span class="functiontext">Locations::of_extension</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">author_name</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">handle</span><span class="plain"> = </span><span class="identifier">Filenames::fopen_caseless</span><span class="plain">(</span><span class="identifier">eventual</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">handle</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">eventual</span><span class="plain"> = </span><span class="functiontext">Locations::of_extension</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">author_name</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">handle</span><span class="plain"> = </span><span class="identifier">Filenames::fopen_caseless</span><span class="plain">(</span><span class="identifier">eventual</span><span class="plain">, </span><span class="string">"r"</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">author_name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">handle</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="functiontext">SourceFiles::get_extension_corresponding</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">return</span><span class="plain"> </span><span class="identifier">RETRIEVE_POINTER_extension_file</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceFiles::get_extension_corresponding is used in 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 6/nv (<a href="6-nv.html#SP14_1">&#167;14.1</a>), 7/hdn (<a href="7-hdn.html#SP16">&#167;16</a>, <a href="7-hdn.html#SP33_1_1">&#167;33.1.1</a>), 8/ef (<a href="8-ef.html#SP21">&#167;21</a>), 9/tfa (<a href="9-tfa.html#SP11_1">&#167;11.1</a>), 17/rs (<a href="17-rs.html#SP7_3_1">&#167;7.3.1</a>), 21/rl2 (<a href="21-rl2.html#SP23_10_1">&#167;23.10.1</a>, <a href="21-rl2.html#SP24">&#167;24</a>), 25/ci (<a href="25-ci.html#SP3_2_3_6">&#167;3.2.3.6</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>, <a href="26-uo.html#SP13_1">&#167;13.1</a>, <a href="26-uo.html#SP16">&#167;16</a>), 27/cm (<a href="27-cm.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And the following converts lexer error conditions into I7 problem messages.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">LEXER_PROBLEM_HANDLER</span><span class="plain"> </span><span class="functiontext">SourceFiles::lexer_problem_handler</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">SourceFiles::lexer_problem_handler</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">problem_source_description</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">word</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">err</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MEMORY_OUT_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Out of memory: unable to create lexer workspace"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STRING_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TooMuchQuotedText</span><span class="plain">),</span>
<span class="string">"Too much text in quotation marks"</span><span class="plain">, </span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"...\</span><span class="plain">"</span><span class="string"> The maximum length is very high, so this is more "</span>
<span class="string">"likely to be because a close quotation mark was "</span>
<span class="string">"forgotten."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">WORD_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_WordTooLong</span><span class="plain">),</span>
<span class="string">"Word too long"</span><span class="plain">, </span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"(Individual words of unquoted text can run up to "</span>
<span class="string">"128 letters long, which ought to be plenty. The longest "</span>
<span class="string">"recognised place name in the English speaking world is "</span>
<span class="string">"a hill in New Zealand called Taumatawhakatang-"</span>
<span class="string">"ihangakoauauot-amateaturipukaka-pikimaunga-"</span>
<span class="string">"horonuku-pokaiwhenuak-itanatahu. (You say tomato, "</span>
<span class="string">"I say taumatawhakatang-...) The longest word found in a "</span>
<span class="string">"classic novel is bababadalgharaghtakamminarronnkonnbronntonn"</span>
<span class="string">"erronntuonnthunntrovarrhounawnskawntoohoohoordenenthurnuk, "</span>
<span class="string">"creation's thunderclap from Finnegan's Wake. And both of those "</span>
<span class="string">"words are fine.)"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">I6_TOO_LONG_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">), </span> <span class="comment">well, not at all conveniently</span>
<span class="string">"Verbatim Inform 6 extract too long"</span><span class="plain">, </span><span class="identifier">word</span><span class="plain">,</span>
<span class="string">"... -). The maximum length is quite high, so this "</span>
<span class="string">"may be because a '-)' was forgotten. Still, if "</span>
<span class="string">"you do need to paste a huge I6 program in, try "</span>
<span class="string">"using several verbatim inclusions in a row."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STRING_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingQuote</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of quoted text"</span><span class="plain">,</span>
<span class="identifier">problem_source_description</span><span class="plain">,</span>
<span class="string">"This probably means that a quotation mark is missing "</span>
<span class="string">"somewhere. If you are using Inform with syntax colouring, "</span>
<span class="string">"look for where the quoted-text colour starts. (Sometimes "</span>
<span class="string">"this problem turns up because a piece of quoted text contains "</span>
<span class="string">"a text substitution in square brackets which in turn contains "</span>
<span class="string">"another piece of quoted text - this is not allowed, and causes "</span>
<span class="string">"me to lose track.)"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">COMMENT_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingComment</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of a comment"</span><span class="plain">,</span>
<span class="identifier">problem_source_description</span><span class="plain">,</span>
<span class="string">"This probably means that a ']' is missing somewhere. "</span>
<span class="string">"(If you are using Inform with syntax colouring, look for "</span>
<span class="string">"where the comment colour starts.) Inform's convention on "</span>
<span class="string">"'nested comments' is that each '[' in a comment must be "</span>
<span class="string">"matched by a corresponding ']': so for instance '[This "</span>
<span class="string">"[even nested like so] acts as a comment]' is a single "</span>
<span class="string">"comment - the first ']' character matches the second '[' "</span>
<span class="string">"and so doesn't end the comment: only the second ']' ends "</span>
<span class="string">"the comment."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">I6_NEVER_ENDS_LEXERERROR</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::lexical_problem_S</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnendingI6</span><span class="plain">),</span>
<span class="string">"Some source text ended in the middle of a verbatim passage "</span>
<span class="string">"of Inform 6 code"</span><span class="plain">,</span>
<span class="identifier">problem_source_description</span><span class="plain">,</span>
<span class="string">"This probably means that a '-)' is missing."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown lexer error"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceFiles::lexer_problem_handler appears nowhere else.</p>
<p class="endnote">The function SourceFiles::get_extension_corresponding is used in 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 6/nv (<a href="6-nv.html#SP14_1">&#167;14.1</a>), 7/hdn (<a href="7-hdn.html#SP17">&#167;17</a>, <a href="7-hdn.html#SP34_1_1">&#167;34.1.1</a>), 8/ef (<a href="8-ef.html#SP11">&#167;11</a>), 9/tfa (<a href="9-tfa.html#SP11_1">&#167;11.1</a>), 17/rs (<a href="17-rs.html#SP7_3_1">&#167;7.3.1</a>), 21/rl2 (<a href="21-rl2.html#SP23_10_1">&#167;23.10.1</a>, <a href="21-rl2.html#SP24">&#167;24</a>), 25/ci (<a href="25-ci.html#SP3_2_3_6">&#167;3.2.3.6</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>, <a href="26-uo.html#SP13_1">&#167;13.1</a>, <a href="26-uo.html#SP16">&#167;16</a>), 27/cm (<a href="27-cm.html#SP2">&#167;2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 3: Bridge to Words Module.)</i></li><li><a href="3-nl.html">Continue with 'Natural Languages'</a></li></ul><hr class="tocbar">

View file

@ -1065,10 +1065,10 @@ author's source text.)
<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">am2</span><span class="plain">-</span><span class="element">&gt;defined_at</span><span class="plain">))) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">am1</span><span class="plain">-</span><span class="element">&gt;adjective_form</span><span class="plain"> != </span><span class="constant">ENUMERATIVE_KADJ</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">am2</span><span class="plain">-</span><span class="element">&gt;adjective_form</span><span class="plain"> != </span><span class="constant">ENUMERATIVE_KADJ</span><span class="plain">)) {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef1</span><span class="plain"> =</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">ef1</span><span class="plain"> =</span>
<span class="functiontext">SourceFiles::get_extension_corresponding</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">am1</span><span class="plain">-</span><span class="element">&gt;defined_at</span><span class="plain">))));</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef2</span><span class="plain"> =</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">ef2</span><span class="plain"> =</span>
<span class="functiontext">SourceFiles::get_extension_corresponding</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">am2</span><span class="plain">-</span><span class="element">&gt;defined_at</span><span class="plain">))));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ef1</span><span class="plain"> == </span><span class="identifier">ef2</span><span class="plain">) || ((</span><span class="identifier">ef1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ef2</span><span class="plain">))) {</span>
@ -1815,10 +1815,10 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">adaptive</span><span class="plain">-</span><span class="identifier">adjective</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">language_of_play</span><span class="plain"> == </span><span class="identifier">English_language</span><span class="plain">) </span><span class="reserved">return</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">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()) == </span><span class="identifier">English_language</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">aph</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">aph</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">AW</span><span class="plain"> = </span><span class="identifier">Clusters::get_name_general</span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">-&gt;</span><span class="identifier">adjective_names</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">, 1, -1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">Clusters::get_name_general</span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">-&gt;</span><span class="identifier">adjective_names</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()), 1, -1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">aph</span><span class="plain">; *</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -1835,10 +1835,10 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Adjectives::Meanings::agreements</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">language_of_play</span><span class="plain"> == </span><span class="identifier">English_language</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()) == </span><span class="identifier">English_language</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">aph</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">aph</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">PW</span><span class="plain"> = </span><span class="identifier">Clusters::get_name_general</span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">-&gt;</span><span class="identifier">adjective_names</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">, 1, -1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Clusters::get_name_general</span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">-&gt;</span><span class="identifier">adjective_names</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()), 1, -1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">PW</span><span class="plain">)) </span><span class="reserved">continue</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">aph</span><span class="plain">-&gt;</span><span class="identifier">aph_iname</span><span class="plain">);</span>
@ -1940,7 +1940,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gna</span><span class="plain">%3 == 1) </span><span class="identifier">gender_sought</span><span class="plain"> = </span><span class="identifier">FEMININE_GENDER</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gna</span><span class="plain"> &gt;= 3) </span><span class="identifier">number_sought</span><span class="plain"> = 2;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">Clusters::get_name_general</span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">-&gt;</span><span class="identifier">adjective_names</span><span class="plain">,</span>
<span class="identifier">language_of_play</span><span class="plain">, </span><span class="identifier">number_sought</span><span class="plain">, </span><span class="identifier">gender_sought</span><span class="plain">);</span>
<span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()), </span><span class="identifier">number_sought</span><span class="plain">, </span><span class="identifier">gender_sought</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">AW</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">PW</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">T</span><span class="plain">);</span>
@ -1976,7 +1976,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<p class="inwebparagraph"></p>
<p class="endnote">The function Adjectives::Meanings::agreements is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Adjectives::Meanings::agreements is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Adjectives::Meanings::emit is used in 25/ci (<a href="25-ci.html#SP3_1">&#167;3.1</a>, <a href="25-ci.html#SP3_2_3_3_1">&#167;3.2.3.3.1</a>, <a href="25-ci.html#SP3_2_3_4_1">&#167;3.2.3.4.1</a>).</p>

View file

@ -236,9 +236,9 @@ whole thing into a <code class="display"><span class="extract">specification</sp
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_TYPE</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">natural_language</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_TYPE</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inform_language</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_ADAPTIVE_PERSON</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::adaptive_person</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_FROM_NAME</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::get_nl</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_FROM_NAME</span><span class="plain"> </span><span class="identifier">Languages::from_name</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_OPTIMISER</span><span class="plain"> </span><span class="functiontext">Semantics::mark_preform_requirements</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_CIRCULARITY_BREAKER</span><span class="plain"> </span><span class="functiontext">Semantics::break_preform_circularities</span>
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_ERROR_HANDLER</span><span class="plain"> </span><span class="functiontext">NaturalLanguages::preform_error</span>
@ -248,7 +248,7 @@ whole thing into a <code class="display"><span class="extract">specification</sp
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Semantics::read_preform</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Mark certain nonterminals to have their vocabularies numbered and flagged</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">NaturalLanguages::scan</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="functiontext">NaturalLanguages::load_preform</span><span class="plain">(</span><span class="functiontext">NaturalLanguages::English</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="functiontext">NaturalLanguages::load_preform</span><span class="plain">(</span><span class="identifier">Projects::get_language_of_syntax</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">nonterminals_declared</span><span class="plain"> = </span><span class="identifier">Preform::parse_preform</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">language_definition_top</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain"> - 1;</span>
@ -258,7 +258,7 @@ whole thing into a <code class="display"><span class="extract">specification</sp
<p class="inwebparagraph"></p>
<p class="endnote">The function Semantics::read_preform is used in 1/mr (<a href="1-mr.html#SP4_7">&#167;4.7</a>).</p>
<p class="endnote">The function Semantics::read_preform is used in 1/htc (<a href="1-htc.html#SP2_1">&#167;2.1</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Mark certain nonterminals to have their vocabularies numbered and flagged</span> <span class="cwebmacronumber">7.1</span>&gt; =

View file

@ -82,7 +82,7 @@ evidence turns up to suggest otherwise).
<p class="inwebparagraph"></p>
<p class="endnote">The structure instance_usage is accessed in 3/pd, 5/lp, 5/ut, 5/un, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure instance_usage is accessed in 3/pd, 5/lp, 5/ut, 5/un, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We record the one most recently made:
</p>
@ -292,7 +292,7 @@ be done later on: see the "Instance Counts" plugin.
<p class="inwebparagraph"></p>
<p class="endnote">The function Instances::get_creating_sentence is used in 2/sq (<a href="2-sq.html#SP2">&#167;2</a>), 5/ipw (<a href="5-ipw.html#SP3_5">&#167;3.5</a>, <a href="5-ipw.html#SP4">&#167;4</a>), 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_2">&#167;3.2.1.7.2</a>).</p>
<p class="endnote">The function Instances::get_creating_sentence is used in 2/sq (<a href="2-sq.html#SP2">&#167;2</a>), 5/ipw (<a href="5-ipw.html#SP3_5">&#167;3.5</a>, <a href="5-ipw.html#SP4">&#167;4</a>), 8/ef (<a href="8-ef.html#SP12_2">&#167;12.2</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
@ -420,9 +420,9 @@ turns up subsequently, e.g., in response to
<p class="inwebparagraph"></p>
<p class="endnote">The function Instances::get_numerical_value is used in 3/nl (<a href="3-nl.html#SP15">&#167;15</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Instances::get_numerical_value is used in 3/nl (<a href="3-nl.html#SP7">&#167;7</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Instances::as_subject is used in <a href="#SP33">&#167;33</a>, 3/nl (<a href="3-nl.html#SP15">&#167;15</a>), 4/am (<a href="4-am.html#SP22">&#167;22</a>), 5/ipw (<a href="5-ipw.html#SP3_7">&#167;3.7</a>, <a href="5-ipw.html#SP3_9">&#167;3.9</a>), 6/rlt (<a href="6-rlt.html#SP26">&#167;26</a>), 9/rpt (<a href="9-rpt.html#SP9_5_1">&#167;9.5.1</a>, <a href="9-rpt.html#SP10_1">&#167;10.1</a>), 9/tc (<a href="9-tc.html#SP5_4">&#167;5.4</a>, <a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/ma (<a href="9-ma.html#SP3_3_41_5">&#167;3.3.41.5</a>), 11/tc (<a href="11-tc.html#SP2">&#167;2</a>), 12/ap (<a href="12-ap.html#SP9_5_2">&#167;9.5.2</a>, <a href="12-ap.html#SP12">&#167;12</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_5_1_3">&#167;11.9.1.1.5.1.3</a>), 15/pr (<a href="15-pr.html#SP27">&#167;27</a>), 15/pov (<a href="15-pov.html#SP4">&#167;4</a>), 16/is (<a href="16-is.html#SP6">&#167;6</a>, <a href="16-is.html#SP12">&#167;12</a>, <a href="16-is.html#SP17">&#167;17</a>), 16/in (<a href="16-in.html#SP19">&#167;19</a>), 16/ic (<a href="16-ic.html#SP8">&#167;8</a>, <a href="16-ic.html#SP12_1">&#167;12.1</a>, <a href="16-ic.html#SP12_3_1">&#167;12.3.1</a>, <a href="16-ic.html#SP12_3_2">&#167;12.3.2</a>, <a href="16-ic.html#SP12_3_3">&#167;12.3.3</a>).</p>
<p class="endnote">The function Instances::as_subject is used in <a href="#SP33">&#167;33</a>, 3/nl (<a href="3-nl.html#SP7">&#167;7</a>), 4/am (<a href="4-am.html#SP22">&#167;22</a>), 5/ipw (<a href="5-ipw.html#SP3_7">&#167;3.7</a>, <a href="5-ipw.html#SP3_9">&#167;3.9</a>), 6/rlt (<a href="6-rlt.html#SP26">&#167;26</a>), 9/rpt (<a href="9-rpt.html#SP9_5_1">&#167;9.5.1</a>, <a href="9-rpt.html#SP10_1">&#167;10.1</a>), 9/tc (<a href="9-tc.html#SP5_4">&#167;5.4</a>, <a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="9-tc.html#SP8_4_1">&#167;8.4.1</a>), 9/ma (<a href="9-ma.html#SP3_3_41_5">&#167;3.3.41.5</a>), 11/tc (<a href="11-tc.html#SP2">&#167;2</a>), 12/ap (<a href="12-ap.html#SP9_5_2">&#167;9.5.2</a>, <a href="12-ap.html#SP12">&#167;12</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_5_1_3">&#167;11.9.1.1.5.1.3</a>), 15/pr (<a href="15-pr.html#SP27">&#167;27</a>), 15/pov (<a href="15-pov.html#SP4">&#167;4</a>), 16/is (<a href="16-is.html#SP6">&#167;6</a>, <a href="16-is.html#SP12">&#167;12</a>, <a href="16-is.html#SP17">&#167;17</a>), 16/in (<a href="16-in.html#SP19">&#167;19</a>), 16/ic (<a href="16-ic.html#SP8">&#167;8</a>, <a href="16-ic.html#SP12_1">&#167;12.1</a>, <a href="16-ic.html#SP12_3_1">&#167;12.3.1</a>, <a href="16-ic.html#SP12_3_2">&#167;12.3.2</a>, <a href="16-ic.html#SP12_3_3">&#167;12.3.3</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. As mere names. </b></p>
@ -435,7 +435,7 @@ turns up subsequently, e.g., in response to
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Instances::get_name_in_play</span><span class="plain">(</span><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">plural</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">I</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;tag</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">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;tag</span><span class="plain">, </span><span class="identifier">plural</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;tag</span><span class="plain">, </span><span class="identifier">plural</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Instances::full_name_includes</span><span class="plain">(</span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">wd</span><span class="plain">) {</span>
@ -466,7 +466,7 @@ turns up subsequently, e.g., in response to
<p class="inwebparagraph"></p>
<p class="endnote">The function Instances::get_name is used in <a href="#SP15_1">&#167;15.1</a>, <a href="#SP15_2">&#167;15.2</a>, <a href="#SP27">&#167;27</a>, <a href="#SP37">&#167;37</a>, <a href="#SP38_2">&#167;38.2</a>, 2/sq (<a href="2-sq.html#SP2">&#167;2</a>), 5/ipw (<a href="5-ipw.html#SP2_2_1">&#167;2.2.1</a>), 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_2">&#167;3.2.1.7.2</a>, <a href="8-ed2.html#SP3_2_1_7_4">&#167;3.2.1.7.4</a>), 9/rpt (<a href="9-rpt.html#SP9_5_1">&#167;9.5.1</a>), 9/tc (<a href="9-tc.html#SP5_4_1">&#167;5.4.1</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Instances::get_name is used in <a href="#SP15_1">&#167;15.1</a>, <a href="#SP15_2">&#167;15.2</a>, <a href="#SP27">&#167;27</a>, <a href="#SP37">&#167;37</a>, <a href="#SP38_2">&#167;38.2</a>, 2/sq (<a href="2-sq.html#SP2">&#167;2</a>), 5/ipw (<a href="5-ipw.html#SP2_2_1">&#167;2.2.1</a>), 8/ef (<a href="8-ef.html#SP12_2">&#167;12.2</a>, <a href="8-ef.html#SP12_4">&#167;12.4</a>), 9/rpt (<a href="9-rpt.html#SP9_5_1">&#167;9.5.1</a>), 9/tc (<a href="9-tc.html#SP5_4_1">&#167;5.4.1</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Instances::get_name_in_play is used in <a href="#SP25">&#167;25</a>, 13/rsfk (<a href="13-rsfk.html#SP24_3">&#167;24.3</a>).</p>
@ -643,7 +643,7 @@ specialised than which other ones, and by making a call, we can find out.
<p class="inwebparagraph"></p>
<p class="endnote">The function Instances::to_kind is used in <a href="#SP12">&#167;12</a>, <a href="#SP15_1">&#167;15.1</a>, <a href="#SP15_2">&#167;15.2</a>, <a href="#SP19">&#167;19</a>, <a href="#SP21">&#167;21</a>, <a href="#SP25">&#167;25</a>, <a href="#SP33">&#167;33</a>, <a href="#SP34">&#167;34</a>, <a href="#SP36">&#167;36</a>, <a href="#SP37">&#167;37</a>, <a href="#SP38_1">&#167;38.1</a>, 2/sq (<a href="2-sq.html#SP2">&#167;2</a>, <a href="2-sq.html#SP4">&#167;4</a>), 4/am (<a href="4-am.html#SP22">&#167;22</a>), 5/ipw (<a href="5-ipw.html#SP3_3_1">&#167;3.3.1</a>, <a href="5-ipw.html#SP3_3_1_1">&#167;3.3.1.1</a>, <a href="5-ipw.html#SP3_4">&#167;3.4</a>, <a href="5-ipw.html#SP3_8">&#167;3.8</a>), 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_2">&#167;3.2.1.7.2</a>), 9/ma (<a href="9-ma.html#SP3_3_40_1">&#167;3.3.40.1</a>, <a href="9-ma.html#SP3_3_41_5">&#167;3.3.41.5</a>), 11/pr (<a href="11-pr.html#SP35_1">&#167;35.1</a>), 12/ap (<a href="12-ap.html#SP9_10">&#167;9.10</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>, <a href="14-rv.html#SP23_1">&#167;23.1</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_5_1_1">&#167;11.9.1.1.5.1.1</a>, <a href="14-ds2.html#SP11_9_1_1_5_1_2">&#167;11.9.1.1.5.1.2</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>), 15/epv (<a href="15-epv.html#SP1_1">&#167;1.1</a>, <a href="15-epv.html#SP1_1_1">&#167;1.1.1</a>), 16/is (<a href="16-is.html#SP19">&#167;19</a>), 16/ic (<a href="16-ic.html#SP12_3">&#167;12.3</a>, <a href="16-ic.html#SP12_3_1">&#167;12.3.1</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>).</p>
<p class="endnote">The function Instances::to_kind is used in <a href="#SP12">&#167;12</a>, <a href="#SP15_1">&#167;15.1</a>, <a href="#SP15_2">&#167;15.2</a>, <a href="#SP19">&#167;19</a>, <a href="#SP21">&#167;21</a>, <a href="#SP25">&#167;25</a>, <a href="#SP33">&#167;33</a>, <a href="#SP34">&#167;34</a>, <a href="#SP36">&#167;36</a>, <a href="#SP37">&#167;37</a>, <a href="#SP38_1">&#167;38.1</a>, 2/sq (<a href="2-sq.html#SP2">&#167;2</a>, <a href="2-sq.html#SP4">&#167;4</a>), 4/am (<a href="4-am.html#SP22">&#167;22</a>), 5/ipw (<a href="5-ipw.html#SP3_3_1">&#167;3.3.1</a>, <a href="5-ipw.html#SP3_3_1_1">&#167;3.3.1.1</a>, <a href="5-ipw.html#SP3_4">&#167;3.4</a>, <a href="5-ipw.html#SP3_8">&#167;3.8</a>), 8/ef (<a href="8-ef.html#SP12_2">&#167;12.2</a>), 9/ma (<a href="9-ma.html#SP3_3_40_1">&#167;3.3.40.1</a>, <a href="9-ma.html#SP3_3_41_5">&#167;3.3.41.5</a>), 11/pr (<a href="11-pr.html#SP35_1">&#167;35.1</a>), 12/ap (<a href="12-ap.html#SP9_10">&#167;9.10</a>), 14/rv (<a href="14-rv.html#SP3">&#167;3</a>, <a href="14-rv.html#SP23_1">&#167;23.1</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_5_1_1">&#167;11.9.1.1.5.1.1</a>, <a href="14-ds2.html#SP11_9_1_1_5_1_2">&#167;11.9.1.1.5.1.2</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>), 15/epv (<a href="15-epv.html#SP1_1">&#167;1.1</a>, <a href="15-epv.html#SP1_1_1">&#167;1.1.1</a>), 16/is (<a href="16-is.html#SP19">&#167;19</a>), 16/ic (<a href="16-ic.html#SP12_3">&#167;12.3</a>, <a href="16-ic.html#SP12_3_1">&#167;12.3.1</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>).</p>
<p class="endnote">The function Instances::of_kind is used in <a href="#SP21">&#167;21</a>, 5/ipw (<a href="5-ipw.html#SP3">&#167;3</a>), 16/ic (<a href="16-ic.html#SP8">&#167;8</a>).</p>
@ -822,7 +822,7 @@ kinds, including "object", the connection is always blank.
<span class="reserved">return</span><span class="plain">;</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">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</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">language_of_play</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</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">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</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">"%+W"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
@ -862,7 +862,7 @@ kinds, including "object", the connection is always blank.
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">IU</span><span class="plain">-</span><span class="element">&gt;where_instance_used</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</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="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">at</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">primary_source_file</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Projects::draws_from_source_file</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">(), </span><span class="identifier">sf</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">k</span><span class="plain"> == 1) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"tight"</span><span class="plain">);</span>
@ -1012,7 +1012,7 @@ Note that only instances, not kinds, appear.
<p class="inwebparagraph"></p>
<p class="endnote">The function Instances::place_objects_in_definition_sequence is used in 16/cmw (<a href="16-cmw.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Instances::place_objects_in_definition_sequence is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>And we read the order back using these macros:
</p>

View file

@ -68,7 +68,7 @@ instance) Spatial.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_panel_changes</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">Data::Objects::page_World</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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">existing_story_file</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">in this case there is no model world</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">()) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">in this case there is no model world</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="identifier">map_plugin</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">in this case there is no model world</span>
<span class="identifier">PL::SpatialMap::establish_benchmark_room</span><span class="plain">();</span>
@ -348,10 +348,10 @@ table of Kinds.
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">language_of_play</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">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">I</span><span class="plain">)) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">IK</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">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">IK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">IK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">()));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</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">"nameless"</span><span class="plain">);</span>
@ -380,13 +380,13 @@ table of Kinds.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</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="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">K_object</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_in_play</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">language_of_play</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_in_play</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">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</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="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Nouns::get_name_in_play</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</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">PW</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (&lt;i&gt;plural&lt;/i&gt; %+W)"</span><span class="plain">, </span><span class="identifier">PW</span><span class="plain">);</span>
</pre>

View file

@ -194,7 +194,7 @@ The rightmost element e_{n-1} is the least significant numerically.
<p class="inwebparagraph"></p>
<p class="endnote">The structure literal_pattern_element is accessed in 1/kts and here.</p>
<p class="endnote">The structure literal_pattern_element is private to this section.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>For the sake of printing, we can specify which notation is to be used in
printing a value back. For instance,
@ -233,7 +233,7 @@ mass might also support "in kilograms" and "in grams", for instance.
<p class="inwebparagraph"></p>
<p class="endnote">The structure literal_pattern_name is accessed in 3/pd, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure literal_pattern_name is accessed in 3/pd, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Creating patterns, tokens and elements. </b></p>
@ -375,7 +375,7 @@ equivalent to an exact value.
<span class="identifier">list_head</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lp_list_add_inner</span><span class="plain">(</span><span class="identifier">list_head</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">()) &amp;&amp; (</span><span class="identifier">PM_ZMachineOverflow2_issued</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">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">())) &amp;&amp; (</span><span class="identifier">PM_ZMachineOverflow2_issued</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">&gt;next_for_this_kind</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">&gt;scaling</span><span class="plain">) &gt; 32767) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ZMachineOverflow2</span><span class="plain">),</span>
@ -881,7 +881,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
<span class="string">"page of the Index.)"</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">overflow_16_bit_flag</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">())) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">overflow_16_bit_flag</span><span class="plain">) &amp;&amp; (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()))) {</span>
<span class="constant">ISSUING_LP_PROBLEM</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ZMachineOverflow</span><span class="plain">),</span>
<span class="string">"you use a literal specification to make a value which is too large"</span><span class="plain">,</span>
@ -3924,7 +3924,7 @@ set.
<p class="inwebparagraph"></p>
<p class="endnote">The function LiteralPatterns::define_named_phrases is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function LiteralPatterns::define_named_phrases is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="inwebparagraph"><a id="SP40_1"></a><b>&#167;40.1. </b>These text substitutions correspond exactly neither to the LPs nor to the
names. For instance, "in tonnes" produces a text substitution which takes

View file

@ -67,7 +67,7 @@ exist; we can simply record inferences about its value.
<p class="endnote">The structure nonlocal_variable_emission is private to this section.</p>
<p class="endnote">The structure nonlocal_variable is accessed in 1/kts, 2/sq, 2/si, 5/ins, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure nonlocal_variable is accessed in 2/sq, 2/si, 5/ins, 8/ef, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>These three special NLVs are used for the "notable" hacky Standard Rules
variables mentioned below:
@ -759,7 +759,7 @@ about it is that it's a variable, and as such, has permission to have the
<p class="inwebparagraph"></p>
<p class="endnote">The function NonlocalVariables::is_global is used in <a href="#SP27">&#167;27</a>, 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_3">&#167;3.2.1.7.3</a>), 11/bas (<a href="11-bas.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function NonlocalVariables::is_global is used in <a href="#SP27">&#167;27</a>, 8/ef (<a href="8-ef.html#SP12_3">&#167;12.3</a>), 11/bas (<a href="11-bas.html#SP19">&#167;19</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>The kind can in fact be changed after creation, though this never happens
to variables declared in source text: it allows us to have a few globals which

View file

@ -100,7 +100,7 @@ instance, the Standard Rules want the player-character object to be called
<p class="inwebparagraph"></p>
<p class="endnote">The function UseNouns::name_all is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function UseNouns::name_all is used in 1/htc (<a href="1-htc.html#SP2_5">&#167;2.5</a>).</p>
<p class="endnote">The function UseNouns::visit_to_name appears nowhere else.</p>
@ -163,7 +163,7 @@ and is a somewhat provisional feature for now.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseNouns::nl_translates</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pn</span><span class="plain">) {</span>
<span class="comment">the object</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">ParseTree::get_defn_language</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">ParseTree::get_defn_language</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">, </span><span class="identifier">gender_reference_ANNOT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</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">"No such NL"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">English_language</span><span class="plain">) {</span>

View file

@ -1324,7 +1324,7 @@ above. This happens very early in compilation.
<p class="inwebparagraph"></p>
<p class="endnote">The function BinaryPredicates::make_built_in is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function BinaryPredicates::make_built_in is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP46"></a><b>&#167;46. Other property-based relations. </b></p>
@ -1349,7 +1349,7 @@ above. This happens very early in compilation.
<p class="inwebparagraph"></p>
<p class="endnote">The function BinaryPredicates::make_built_in_further is used in 1/mr (<a href="1-mr.html#SP4_12">&#167;4.12</a>).</p>
<p class="endnote">The function BinaryPredicates::make_built_in_further is used in 1/htc (<a href="1-htc.html#SP2_6">&#167;2.6</a>).</p>
<p class="inwebparagraph"><a id="SP47"></a><b>&#167;47. </b></p>

View file

@ -90,7 +90,7 @@ cleared.)
<p class="inwebparagraph"></p>
<p class="endnote">The function NewVerbs::add_inequalities is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function NewVerbs::add_inequalities is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function NewVerbs::add_inequalities_inner appears nowhere else.</p>
@ -129,8 +129,8 @@ as the object.
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">implies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="identifier">in</span><span class="plain"> &lt;</span><span class="identifier">natural</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt; &lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; &lt;&lt;</span><span class="reserved">natural_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt; = (</span><span class="reserved">natural_language</span><span class="plain"> *) (</span><span class="identifier">RP</span><span class="plain">[1]);</span>
<span class="plain">&lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="reserved">natural_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt; = </span><span class="identifier">English_language</span><span class="plain">;</span>
<span class="identifier">in</span><span class="plain"> &lt;</span><span class="identifier">natural</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt; &lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">inform_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt; = (</span><span class="identifier">inform_language</span><span class="plain"> *) (</span><span class="identifier">RP</span><span class="plain">[1]);</span>
<span class="plain">&lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">inform_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt; = </span><span class="identifier">English_language</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt; ::=</span>
<span class="identifier">to</span><span class="plain"> &lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">usage</span><span class="plain">&gt; ( ... ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">giving</span><span class="plain">-</span><span class="identifier">parts</span><span class="plain">&gt;&gt; = </span><span class="identifier">TRUE</span>
@ -390,7 +390,7 @@ now absolutely any non-empty word range is accepted as the property name.
&lt;<span class="cwebmacro">Find the underlying relation of the new verb or preposition</span> <span class="cwebmacronumber">14.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">implies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">))) {</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = &lt;&lt;</span><span class="reserved">natural_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = &lt;&lt;</span><span class="identifier">inform_language</span><span class="plain">:</span><span class="identifier">nl</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">usage</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">giving</span><span class="plain">-</span><span class="identifier">parts</span><span class="plain">&gt;&gt;) </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">infinitive</span><span class="plain">-</span><span class="identifier">declaration</span><span class="plain">&gt;, 1);</span>
@ -485,8 +485,8 @@ now absolutely any non-empty word range is accepted as the property name.
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">MW</span><span class="plain">) != 1) || (</span><span class="identifier">VerbMeanings::is_meaningless</span><span class="plain">(&amp;</span><span class="identifier">vm</span><span class="plain">))) {</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">pos</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">MW</span><span class="plain">));</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">loc</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">pos</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">loc</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NoSuchBuiltInMeaning</span><span class="plain">),</span>
<span class="string">"that's not one of the built-in meanings I know"</span><span class="plain">,</span>
@ -1034,7 +1034,7 @@ foreign verbs (4).
<p class="endnote">The function NewVerbs::ConjugateVerbDefinitions is used in 27/ei (<a href="27-ei.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function NewVerbs::ConjugateVerb is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function NewVerbs::ConjugateVerb is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP18_1"></a><b>&#167;18.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile ConjugateVerb routine</span> <span class="cwebmacronumber">18.1</span>&gt; =
@ -1504,7 +1504,7 @@ foreign verbs (4).
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="identifier">in</span><span class="plain"> &lt;</span><span class="identifier">natural</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt; ... | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
<span class="plain">... ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">language_of_play</span><span class="plain">;</span>
<span class="plain">... ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="functiontext">Task::project</span><span class="plain">());</span>
</pre>
<p class="inwebparagraph"></p>
@ -1558,7 +1558,7 @@ usages to the debugging log.
<p class="endnote">The function NewVerbs::log is used in 7/ptu (<a href="7-ptu.html#SP17_1">&#167;17.1</a>).</p>
<p class="endnote">The function NewVerbs::log_all is used in 1/mr (<a href="1-mr.html#SP4_18">&#167;4.18</a>).</p>
<p class="endnote">The function NewVerbs::log_all is used in 1/mr (<a href="1-mr.html#SP1_5">&#167;1.5</a>).</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. Index tabulation. </b>The following produces the table of verbs in the Phrasebook Index page.
</p>

View file

@ -1219,7 +1219,7 @@ logical properties of the two terms of the BP being defined.
<span class="identifier">RELS_LOOKUP_ALL_X_iname</span><span class="plain"> = </span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="constant">RELS_LOOKUP_ALL_X_HL</span><span class="plain">, 0</span><span class="identifier">x0004</span><span class="plain">);</span>
<span class="identifier">RELS_LOOKUP_ALL_Y_iname</span><span class="plain"> = </span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="constant">RELS_LOOKUP_ALL_Y_HL</span><span class="plain">, 0</span><span class="identifier">x0002</span><span class="plain">);</span>
<span class="identifier">RELS_LIST_iname</span><span class="plain"> = </span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="constant">RELS_LIST_HL</span><span class="plain">, 0</span><span class="identifier">x0001</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">()) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">())) {</span>
<span class="identifier">REL_BLOCK_HEADER_symbol</span><span class="plain"> = </span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="constant">REL_BLOCK_HEADER_HL</span><span class="plain">, 0</span><span class="identifier">x100</span><span class="plain">*5 + 13); </span> <span class="comment">2^5 = 32 bytes block</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">REL_BLOCK_HEADER_symbol</span><span class="plain"> = </span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="constant">REL_BLOCK_HEADER_HL</span><span class="plain">, (0</span><span class="identifier">x100</span><span class="plain">*6 + 13)*0</span><span class="identifier">x10000</span><span class="plain">);</span>
@ -1233,7 +1233,7 @@ logical properties of the two terms of the BP being defined.
<p class="endnote">The function Relations::compile_defined_relation_constant appears nowhere else.</p>
<p class="endnote">The function Relations::compile_defined_relation_constants is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Relations::compile_defined_relation_constants is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b></p>
@ -2385,7 +2385,7 @@ logical properties of the two terms of the BP being defined.
<p class="inwebparagraph"></p>
<p class="endnote">The function Relations::IterateRelations is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Relations::IterateRelations is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. The bitmap for various-to-various relations. </b>It is unavoidable that a general V-to-V relation will take at least LR bits
of storage, where L is the size of the left domain and R the size of the
@ -2460,11 +2460,6 @@ logical properties of the two terms of the BP being defined.
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">rname</span><span class="plain">, </span><span class="string">"%A"</span><span class="plain">, &amp;(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">&gt;relation_name</span><span class="plain">));</span>
<span class="functiontext">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"relation"</span><span class="plain">,</span>
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">&gt;bp_created_at</span><span class="plain">), </span><span class="identifier">rname</span><span class="plain">, </span><span class="identifier">words_used</span><span class="plain">, </span><span class="identifier">bytes_used</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rname</span><span class="plain">);</span>
<span class="functiontext">Relations::free_index_storage</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
@ -3146,7 +3141,7 @@ logical properties of the two terms of the BP being defined.
<p class="inwebparagraph"></p>
<p class="endnote">The function Relations::compile_defined_relations is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Relations::compile_defined_relations is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="inwebparagraph"><a id="SP29_1"></a><b>&#167;29.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile RProperty routine</span> <span class="cwebmacronumber">29.1</span>&gt; =

View file

@ -11,7 +11,7 @@
<!--Weave of '7/hdn' 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#7">Chapter 7: Sentences</a></li><li><b>Headings</b></li></ul><p class="purpose">To keep track of the hierarchy of headings and subheadings found in the source text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP9">&#167;9. Declarations</a></li><li><a href="#SP10_2">&#167;10.2. Parsing heading qualifiers</a></li><li><a href="#SP12">&#167;12. The heading tree</a></li><li><a href="#SP14">&#167;14. Verifying the heading tree</a></li><li><a href="#SP15">&#167;15. Miscellaneous heading services</a></li><li><a href="#SP19">&#167;19. Headings with extension dependencies</a></li><li><a href="#SP22">&#167;22. World objects under each heading</a></li><li><a href="#SP24">&#167;24. The noun search list</a></li><li><a href="#SP30">&#167;30. Handling headings during the main traverses</a></li><li><a href="#SP31">&#167;31. Describing the heading structure, 1: to the debugging log</a></li><li><a href="#SP33">&#167;33. Describing the heading structure, 2: to the index</a></li><li><a href="#SP34">&#167;34. Describing the heading structure, 3: to a freestanding XML file</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP9">&#167;9. Declarations</a></li><li><a href="#SP10_2">&#167;10.2. Parsing heading qualifiers</a></li><li><a href="#SP13">&#167;13. The heading tree</a></li><li><a href="#SP15">&#167;15. Verifying the heading tree</a></li><li><a href="#SP16">&#167;16. Miscellaneous heading services</a></li><li><a href="#SP20">&#167;20. Headings with extension dependencies</a></li><li><a href="#SP23">&#167;23. World objects under each heading</a></li><li><a href="#SP25">&#167;25. The noun search list</a></li><li><a href="#SP31">&#167;31. Handling headings during the main traverses</a></li><li><a href="#SP32">&#167;32. Describing the heading structure, 1: to the debugging log</a></li><li><a href="#SP34">&#167;34. Describing the heading structure, 2: to the index</a></li><li><a href="#SP35">&#167;35. Describing the heading structure, 3: to a freestanding XML file</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
@ -74,7 +74,7 @@ made from the following structures:
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">for_release</span><span class="plain">; </span> <span class="comment">include this material in a release version?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">omit_material</span><span class="plain">; </span> <span class="comment">if set, simply ignore all of this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use_with_or_without</span><span class="plain">; </span> <span class="comment">if TRUE, use with the extension; if FALSE, without</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">extension_identifier</span><span class="plain"> </span><span class="identifier">for_use_with</span><span class="plain">; </span> <span class="comment">e.g. "for use with ... by ..."</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">for_use_with</span><span class="plain">; </span> <span class="comment">e.g. "for use with ... by ..."</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">in_place_of_text</span><span class="plain">; </span> <span class="comment">e.g. "in place of ... in ... by ..."</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">heading_text</span><span class="plain">; </span> <span class="comment">once provisos have been stripped away</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">list_of_contents</span><span class="plain">; </span> <span class="comment">tagged names defined under this</span>
@ -241,7 +241,7 @@ than assist.
<p class="inwebparagraph"></p>
<p class="endnote">The structure contents_entry is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure contents_entry is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Declarations. </b>The heading tree is constructed all at once, after most of the sentence-breaking
is done, but since a few sentences can in principle be added later, we watch
@ -269,8 +269,7 @@ and cannot contain information about releasing or about virtual machines.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="constant">NO_HEADING_LEVELS</span><span class="plain">], </span><span class="identifier">lial_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">extension_identifier</span><span class="plain"> *</span><span class="identifier">grammar_eid</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">work_identified</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Sentences::Headings::declare</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain">);</span>
@ -281,6 +280,7 @@ and cannot contain information about releasing or about virtual machines.
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;index_definitions_made_under_this</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;use_with_or_without</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;in_place_of_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PN</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">))))</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"heading at textless node"</span><span class="plain">);</span>
@ -303,7 +303,7 @@ and cannot contain information about releasing or about virtual machines.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::declare is used in 7/ss (<a href="7-ss.html#SP3">&#167;3</a>, <a href="7-ss.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Sentences::Headings::declare is used in 7/ss (<a href="7-ss.html#SP3">&#167;3</a>, <a href="7-ss.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b>This implements the indentation algorithm described above.
</p>
@ -350,7 +350,6 @@ and cannot contain information about releasing or about virtual machines.
<pre class="displaydefn">
<span class="identifier">grammar_eid</span><span class="plain"> = &amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">);</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">PN</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">);</span>
@ -365,12 +364,12 @@ and cannot contain information about releasing or about virtual machines.
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IN_PLACE_OF_HQ</span><span class="plain">:</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;use_with_or_without</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;in_place_of_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">qualifier</span><span class="plain">&gt;, 1);</span>
<span class="functiontext">CoreMain::disable_importation</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">&gt;, 1);</span>
<span class="plain">}</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;heading_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain"> = </span><span class="identifier">work_identified</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
@ -416,7 +415,7 @@ allowed; they should probably be withdrawn.
<span class="plain">&lt;</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">language</span><span class="plain">-</span><span class="identifier">element</span><span class="plain">&gt; </span><span class="identifier">language</span><span class="plain"> </span><span class="identifier">element</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">...... </span><span class="identifier">language</span><span class="plain"> </span><span class="identifier">element</span><span class="plain"> | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_UnknownLanguageElement problem</span> <span class="cwebmacronumber">11.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">current</span><span class="plain">-</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">...... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_UnknownVirtualMachine problem</span> <span class="cwebmacronumber">11.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">&gt; ::=</span>
@ -479,7 +478,8 @@ allowed; they should probably be withdrawn.
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</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">identifier</span><span class="plain">&gt;, 2);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">TW</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">);</span>
<span class="functiontext">Extensions::IDs::new</span><span class="plain">(</span><span class="identifier">grammar_eid</span><span class="plain">, </span><span class="identifier">exfa</span><span class="plain">, </span><span class="identifier">exft</span><span class="plain">, </span><span class="constant">USEWITH_EIDBC</span><span class="plain">);</span>
<span class="identifier">work_identified</span><span class="plain"> = </span><span class="identifier">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">exft</span><span class="plain">, </span><span class="identifier">exfa</span><span class="plain">);</span>
<span class="identifier">Works::add_to_database</span><span class="plain">(</span><span class="identifier">work_identified</span><span class="plain">, </span><span class="identifier">USEWITH_WDBC</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">);</span>
</pre>
@ -488,7 +488,24 @@ allowed; they should probably be withdrawn.
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. The heading tree. </b>The headings were constructed above as freestanding nodes (except that the
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">current</span><span class="plain">-</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">Compatibility::with</span><span class="plain">((</span><span class="identifier">compatibility_specification</span><span class="plain"> *) &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;, </span><span class="functiontext">Task::vm</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. The heading tree. </b>The headings were constructed above as freestanding nodes (except that the
pseudo-heading already existed): here, we assemble them into a tree
structure. Because we want to be able to call this more than once, perhaps
to make revisions if late news comes in of a new heading (see above), we
@ -499,11 +516,11 @@ begin by removing any existing relationships between the heading nodes.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::make_tree</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">13.1</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">12.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">12.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">13.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">13.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">heading_tree_made_at_least_once</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
@ -513,16 +530,16 @@ begin by removing any existing relationships between the heading nodes.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::make_tree is used in <a href="#SP10">&#167;10</a>, <a href="#SP27_3">&#167;27.3</a>, 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Sentences::Headings::make_tree is used in <a href="#SP10">&#167;10</a>, <a href="#SP28_3">&#167;28.3</a>, 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b>Note that the loop over headings below loops through all those which were
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b>Note that the loop over headings below loops through all those which were
created by the memory manager: which is to say, all of them except for the
pseudo-heading, which was explicitly placed in static memory above.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">12.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
@ -537,9 +554,9 @@ pseudo-heading, which was explicitly placed in static memory above.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP12_2"></a><b>&#167;12.2. </b>The idea of the heading loop is that when we place a heading, we also place
<p class="inwebparagraph"><a id="SP13_2"></a><b>&#167;13.2. </b>The idea of the heading loop is that when we place a heading, we also place
subsequent headings of lesser or equal status until we cannot do so any longer.
That means that if we reach h and find that it has no parent, it must be
subordinate to no earlier heading: thus, it must be attached to the pseudo-heading
@ -548,7 +565,7 @@ at the top of the tree.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">12.2</span>&gt; =
&lt;<span class="cwebmacrodefn">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">13.2</span>&gt; =
</code></p>
@ -559,9 +576,9 @@ at the top of the tree.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP12_3"></a><b>&#167;12.3. </b>Note that the following could be summed up as "move subsequent headings as
<p class="inwebparagraph"><a id="SP13_3"></a><b>&#167;13.3. </b>Note that the following could be summed up as "move subsequent headings as
deep in the tree as we can see they need to be from h's perspective alone".
This isn't always the final position. For instance, given the sequence
Volume 1, Chapter I, Section A, Chapter II, the tree is adjusted twice:
@ -587,7 +604,7 @@ most 9, it runs in linear time.)
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">12.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">13.3</span>&gt; =
</code></p>
@ -605,9 +622,9 @@ most 9, it runs in linear time.)
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>The above routine, then, calls <code class="display"><span class="extract">Sentences::Headings::make_child_heading</span></code> to attach a heading
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The above routine, then, calls <code class="display"><span class="extract">Sentences::Headings::make_child_heading</span></code> to attach a heading
to the tree as a child of a given parent:
</p>
@ -616,17 +633,17 @@ to the tree as a child of a given parent:
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::make_child_heading</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">former_pa</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">-</span><span class="element">&gt;parent_heading</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">former_pa</span><span class="plain"> == </span><span class="identifier">pa</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">13.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">14.1</span>&gt;<span class="plain">;</span>
<span class="identifier">ch</span><span class="plain">-</span><span class="element">&gt;parent_heading</span><span class="plain"> = </span><span class="identifier">pa</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">13.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">14.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::make_child_heading is used in <a href="#SP12_2">&#167;12.2</a>, <a href="#SP12_3">&#167;12.3</a>.</p>
<p class="endnote">The function Sentences::Headings::make_child_heading is used in <a href="#SP13_2">&#167;13.2</a>, <a href="#SP13_3">&#167;13.3</a>.</p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b>If ch is present in the tree, it must have a parent, unless it is the
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b>If ch is present in the tree, it must have a parent, unless it is the
pseudo-heading: but the latter can never be moved, so it isn't. Therefore
we can remove ch by striking it out from the children list of the parent.
(Any children which ch has, grandchildren so to speak, come with it.)
@ -634,7 +651,7 @@ we can remove ch by striking it out from the children list of the parent.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">13.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">14.1</span>&gt; =
</code></p>
@ -656,14 +673,14 @@ we can remove ch by striking it out from the children list of the parent.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP13_2"></a><b>&#167;13.2. </b>Two cases: the new parent is initially childless, or it isn't.
<p class="inwebparagraph"><a id="SP14_2"></a><b>&#167;14.2. </b>Two cases: the new parent is initially childless, or it isn't.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">13.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">14.2</span>&gt; =
</code></p>
@ -680,9 +697,9 @@ we can remove ch by striking it out from the children list of the parent.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Verifying the heading tree. </b>We have now, in effect, computed the indentation value of each heading twice,
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Verifying the heading tree. </b>We have now, in effect, computed the indentation value of each heading twice,
by two entirely different methods: first by the mathematical argument above,
then by observing that it is the depth in the heading tree. Seeing if
these two methods have given the same answer provides a convenient check on
@ -710,11 +727,11 @@ our working.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::verify_heading_tree is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">The function Sentences::Headings::verify_heading_tree is used in <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">The function Sentences::Headings::verify_heading_tree_recursively appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Miscellaneous heading services. </b>The first of these we have already seen in use: the sentence-breaker calls
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Miscellaneous heading services. </b>The first of these we have already seen in use: the sentence-breaker calls
it to ask whether sentences falling under the current heading should be
included in the active source text. (For instance, sentences under a
heading with the disclaimer "(for Glulx only)" will not be included
@ -724,8 +741,9 @@ if the target virtual machine on this run of Inform is the Z-machine.)
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::include_material</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_release</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">this_is_a_release_compile</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</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">h</span><span class="plain">-</span><span class="element">&gt;for_release</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">this_is_a_release_compile</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">releasing</span><span class="plain"> = </span><span class="identifier">Inbuild::currently_releasing</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_release</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">releasing</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</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">h</span><span class="plain">-</span><span class="element">&gt;for_release</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">releasing</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">)) </span><span class="reserved">return</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">h</span><span class="plain">-</span><span class="element">&gt;omit_material</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -740,14 +758,14 @@ if the target virtual machine on this run of Inform is the Z-machine.)
<p class="endnote">The function Sentences::Headings::include_material is used in 7/ss (<a href="7-ss.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Sentences::Headings::indexed is used in 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>), 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_3">&#167;3.2.1.7.3</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Sentences::Headings::indexed is used in 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>), 8/ef (<a href="8-ef.html#SP12_3">&#167;12.3</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>A utility to do with the file of origin:
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>A utility to do with the file of origin:
</p>
<pre class="display">
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;start_location</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="reserved">return</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="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;start_location</span><span class="plain">.</span><span class="identifier">file_of_origin</span><span class="plain">);</span>
<span class="plain">}</span>
@ -755,9 +773,9 @@ if the target virtual machine on this run of Inform is the Z-machine.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::get_extension_containing is used in <a href="#SP20">&#167;20</a>, 19/tb (<a href="19-tb.html#SP31">&#167;31</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>), 25/cp (<a href="25-cp.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function Sentences::Headings::get_extension_containing is used in <a href="#SP21">&#167;21</a>, 19/tb (<a href="19-tb.html#SP31">&#167;31</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Although File (0) headings do have text, contrary to the implication of
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>Although File (0) headings do have text, contrary to the implication of
the routine here, this text is only what happens to be first in the file:
it isn't a heading actually typed by the user, which is all that we are
interested in for this purpose. So we send back a null word range.
@ -775,7 +793,7 @@ interested in for this purpose. So we send back a null word range.
<p class="endnote">The function Sentences::Headings::get_text is used in 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>), 22/pi (<a href="22-pi.html#SP1_2">&#167;1.2</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>This routine determines the (closest) heading to which a scrap of text
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>This routine determines the (closest) heading to which a scrap of text
belongs, and is important since the parsing of noun phrases is affected by
that choice of heading (as we shall see): to Inform, headings provide something
analogous to the scope of local variables in a conventional programming
@ -807,11 +825,11 @@ file and a line number of at least 1).
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::heading_of is used in <a href="#SP27_1">&#167;27.1</a>.</p>
<p class="endnote">The function Sentences::Headings::heading_of is used in <a href="#SP28_1">&#167;28.1</a>.</p>
<p class="endnote">The function Sentences::Headings::of_wording is used in <a href="#SP22">&#167;22</a>, 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>), 8/ed2 (<a href="8-ed2.html#SP3_2_1_7_3">&#167;3.2.1.7.3</a>), 19/tb (<a href="19-tb.html#SP31">&#167;31</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>), 25/cp (<a href="25-cp.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function Sentences::Headings::of_wording is used in <a href="#SP23">&#167;23</a>, 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>), 8/ef (<a href="8-ef.html#SP12_3">&#167;12.3</a>), 19/tb (<a href="19-tb.html#SP31">&#167;31</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Headings with extension dependencies. </b>If the content under a heading depended on the VM not in use, or was marked
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. Headings with extension dependencies. </b>If the content under a heading depended on the VM not in use, or was marked
not for release in a release run, we were able to exclude it just by
skipping. The same cannot be done when a heading says that it should be
used only if a given extension is, or is not, being used, because when
@ -831,9 +849,9 @@ But when the following is called, we do know that.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::satisfy_dependencies is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Sentences::Headings::satisfy_dependencies is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>And now the code to check an individual heading's usage. This whole
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>And now the code to check an individual heading's usage. This whole
thing is carefully timed so that we can still afford to cut up and rearrange
the parse tree on quite a large scale, and that's just what we do.
</p>
@ -842,9 +860,9 @@ the parse tree on quite a large scale, and that's just what we do.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::satisfy_individual_heading_dependency</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;level</span><span class="plain"> &lt; 1) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">extension_identifier</span><span class="plain"> *</span><span class="identifier">eid</span><span class="plain"> = &amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">);</span>
<span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">loaded</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">Extensions::IDs::no_times_used_in_context</span><span class="plain">(</span><span class="identifier">eid</span><span class="plain">, </span><span class="constant">LOADED_EIDBC</span><span class="plain">) != 0) </span><span class="identifier">loaded</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Works::no_times_used_in_context</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">LOADED_WDBC</span><span class="plain">) != 0) </span><span class="identifier">loaded</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">HEADINGS</span><span class="plain">, </span><span class="string">"SIHD on $H: loaded %d: annotation %d: %W: %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">loaded</span><span class="plain">,</span>
<span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">,</span>
<span class="constant">suppress_heading_dependencies_ANNOT</span><span class="plain">),</span>
@ -859,22 +877,21 @@ the parse tree on quite a large scale, and that's just what we do.
<span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h2</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</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">loaded</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">20.1</span>&gt;
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">loaded</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">21.1</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">, </span><span class="reserved">heading</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">h2</span><span class="plain">-</span><span class="element">&gt;heading_text</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Wordings::match_perhaps_quoted</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;heading_text</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Extensions::IDs::match</span><span class="plain">(</span>
<span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span>
<span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">)), </span><span class="identifier">eid</span><span class="plain">))) {</span>
<span class="plain">(</span><span class="identifier">Works::match</span><span class="plain">(</span>
<span class="functiontext">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">h2</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">work</span><span class="plain">))) {</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;level</span><span class="plain"> != </span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;level</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Can't replace heading unless level matches</span> <span class="cwebmacronumber">20.3</span>&gt;<span class="character">;</span>
&lt;<span class="cwebmacro">Can't replace heading unless level matches</span> <span class="cwebmacronumber">21.3</span>&gt;<span class="character">;</span>
<span class="functiontext">Sentences::Headings::excise_material_under</span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Sentences::Headings::excise_material_under</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't find heading in the given extension</span> <span class="cwebmacronumber">20.2</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't find heading in the given extension</span> <span class="cwebmacronumber">21.2</span>&gt;<span class="character">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span>
@ -884,17 +901,17 @@ the parse tree on quite a large scale, and that's just what we do.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::satisfy_individual_heading_dependency is used in <a href="#SP19">&#167;19</a>.</p>
<p class="endnote">The function Sentences::Headings::satisfy_individual_heading_dependency is used in <a href="#SP20">&#167;20</a>.</p>
<p class="inwebparagraph"><a id="SP20_1"></a><b>&#167;20.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">20.1</span>&gt; =
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">21.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, &amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">));</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</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">PM_HeadingInPlaceOfUnincluded</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In the sentence %1, it looks as if you intend to replace a section "</span>
@ -906,9 +923,9 @@ the parse tree on quite a large scale, and that's just what we do.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a>.</p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>To excise, we simply prune the heading's contents from the parse tree,
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>To excise, we simply prune the heading's contents from the parse tree,
though optionally grafting them to another node rather than discarding them
altogether.
</p>
@ -929,7 +946,7 @@ elsewhere).
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;in_place_of_text</span><span class="plain">)) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h2</span><span class="plain"> = </span><span class="functiontext">Sentences::Headings::find_dependent_heading</span><span class="plain">(</span><span class="identifier">hpn</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h2</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">21.1</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h2</span><span class="plain">) </span>&lt;<span class="cwebmacro">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">22.1</span>&gt;<span class="character">;</span>
<span class="plain">}</span>
<span class="functiontext">Sentences::Headings::suppress_dependencies</span><span class="plain">(</span><span class="identifier">hpn</span><span class="plain">);</span>
@ -959,23 +976,23 @@ elsewhere).
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::excise_material_under is used in <a href="#SP20">&#167;20</a>.</p>
<p class="endnote">The function Sentences::Headings::excise_material_under is used in <a href="#SP21">&#167;21</a>.</p>
<p class="endnote">The function Sentences::Headings::find_dependent_heading appears nowhere else.</p>
<p class="endnote">The function Sentences::Headings::suppress_dependencies appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">21.1</span>&gt; =
<p class="inwebparagraph"><a id="SP22_1"></a><b>&#167;22.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">22.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, &amp;(</span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">));</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, </span><span class="identifier">h2</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(3, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(4, &amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">));</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(4, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</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">PM_HeadingInPlaceOfSubordinate</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In the sentence %1, it looks as if you intend to replace a section "</span>
@ -987,25 +1004,27 @@ elsewhere).
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="endnote">This code is used in <a href="#SP22">&#167;22</a>.</p>
<p class="inwebparagraph"><a id="SP20_2"></a><b>&#167;20.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't find heading in the given extension</span> <span class="cwebmacronumber">20.2</span>&gt; =
<p class="inwebparagraph"><a id="SP21_2"></a><b>&#167;21.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't find heading in the given extension</span> <span class="cwebmacronumber">21.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">);</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;sentence_declaring</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, &amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">));</span>
<span class="functiontext">Problems::quote_extension_id</span><span class="plain">(2, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;in_place_of_text</span><span class="plain">);</span>
<span class="identifier">Problems::quote_text</span><span class="plain">(4,</span>
<span class="string">"unspecified, that is, the extension didn't have a version number"</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Extensions::IDs::match</span><span class="plain">(&amp;(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</span><span class="plain">), </span><span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">)))</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(4,</span>
<span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="functiontext">Extensions::Files::get_version_wn</span><span class="plain">(</span><span class="identifier">ef</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">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">Works::match</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-</span><span class="element">&gt;for_use_with</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">VersionNumbers::to_text</span><span class="plain">(</span><span class="identifier">vt</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">Problems::quote_stream</span><span class="plain">(4, </span><span class="identifier">vt</span><span class="plain">);</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">PM_HeadingInPlaceOfUnknown</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In the sentence %1, it looks as if you intend to replace a section "</span>
@ -1013,14 +1032,15 @@ elsewhere).
<span class="string">"not seem to have any heading called '%3'. (The version I loaded "</span>
<span class="string">"was %4.)"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a>.</p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP20_3"></a><b>&#167;20.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading unless level matches</span> <span class="cwebmacronumber">20.3</span>&gt; =
<p class="inwebparagraph"><a id="SP21_3"></a><b>&#167;21.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Can't replace heading unless level matches</span> <span class="cwebmacronumber">21.3</span>&gt; =
</code></p>
@ -1035,9 +1055,9 @@ elsewhere).
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a>.</p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. World objects under each heading. </b>Every heading must carry with it a linked list of the nametags created in
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. World objects under each heading. </b>Every heading must carry with it a linked list of the nametags created in
sentences which belong to it. So when any noun is created, the following
is called to let the current sentence's heading know that it has a new
friend.
@ -1072,11 +1092,11 @@ friend.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::name_resolution_data is used in <a href="#SP23">&#167;23</a>, <a href="#SP25">&#167;25</a>, <a href="#SP28_1">&#167;28.1</a>, <a href="#SP29">&#167;29</a>.</p>
<p class="endnote">The function Sentences::Headings::name_resolution_data is used in <a href="#SP24">&#167;24</a>, <a href="#SP26">&#167;26</a>, <a href="#SP29_1">&#167;29.1</a>, <a href="#SP30">&#167;30</a>.</p>
<p class="endnote">The function Sentences::Headings::attach_noun appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>The following verification checks that every noun is listed
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following verification checks that every noun is listed
in the list for exactly one heading. The point of the check is not so much
to make sure the tag lists are properly formed, as the code making those
is pretty elementary: it's really a test that the source text is well-formed
@ -1113,7 +1133,7 @@ through a crack.
<p class="endnote">The function Sentences::Headings::verify_divisions appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. The noun search list. </b>Identifying noun phrases is tricky. Many plausible phrases could refer in
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. The noun search list. </b>Identifying noun phrases is tricky. Many plausible phrases could refer in
principle to several different instances: "east", for instance, might
mean the direction or, say, "east garden". And what if the source
mentions many chairs, and now refers simply to "the chair"? This problem
@ -1176,7 +1196,7 @@ in order that "door" will retain its generic meaning even if, say,
"an oak door" is created.
</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>This means that, under every heading, the search sequence is different.
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>This means that, under every heading, the search sequence is different.
So for the sake of efficiency we construct a linked list of world
objects in priority order the first time we search under a new heading,
then simply use that thereafter: we also keep track of the tail of this
@ -1196,7 +1216,7 @@ use the following definition to iterate through it.
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>The search sequence is, in effect, a cache storing a former computation,
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>The search sequence is, in effect, a cache storing a former computation,
and like all caches it can fall out of date if the circumstances change so
that the same computation would now produce a different outcome. That can
only happen here if a new noun is to be created: the assertion-maker
@ -1216,7 +1236,7 @@ calls the following routine to let us know.
<p class="endnote">The function Sentences::Headings::disturb appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>Leaving aside the cache, then, we build a list as initially empty, then
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>Leaving aside the cache, then, we build a list as initially empty, then
all nametags of priority 1 as found by recursively searching headings, then all
nametags of priority 2, and so on.
</p>
@ -1226,19 +1246,19 @@ nametags of priority 2, and so on.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::construct_noun_search_list</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Work out the heading from which we wish to search</span> <span class="cwebmacronumber">27.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Work out the heading from which we wish to search</span> <span class="cwebmacronumber">28.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">noun_search_list_valid_for_this_heading</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">rely on the cache</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">HEADINGS</span><span class="plain">, </span><span class="string">"Rebuilding noun search list from: $H\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Start the search list empty</span> <span class="cwebmacronumber">27.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Start the search list empty</span> <span class="cwebmacronumber">28.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">MAX_NOUN_PRIORITY</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="functiontext">Sentences::Headings::build_search_list_from</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Verify that the search list indeed contains every noun just once</span> <span class="cwebmacronumber">27.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Verify that the search list indeed contains every noun just once</span> <span class="cwebmacronumber">28.3</span>&gt;<span class="plain">;</span>
<span class="identifier">noun_search_list_valid_for_this_heading</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">;</span>
<span class="plain">}</span>
@ -1248,13 +1268,13 @@ nametags of priority 2, and so on.
<p class="endnote">The function Sentences::Headings::construct_noun_search_list appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP27_1"></a><b>&#167;27.1. </b>Basically, we calculate the search list from the point of view of the
<p class="inwebparagraph"><a id="SP28_1"></a><b>&#167;28.1. </b>Basically, we calculate the search list from the point of view of the
current sentence:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out the heading from which we wish to search</span> <span class="cwebmacronumber">27.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Work out the heading from which we wish to search</span> <span class="cwebmacronumber">28.1</span>&gt; =
</code></p>
@ -1267,16 +1287,16 @@ current sentence:
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP27">&#167;27</a>.</p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP27_2"></a><b>&#167;27.2. </b>The pseudo-heading has no list of contents because all objects are created in
<p class="inwebparagraph"><a id="SP28_2"></a><b>&#167;28.2. </b>The pseudo-heading has no list of contents because all objects are created in
source files, each certainly underneath a File (0) heading, so nothing should
ever get that far.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Start the search list empty</span> <span class="cwebmacronumber">27.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Start the search list empty</span> <span class="cwebmacronumber">28.2</span>&gt; =
</code></p>
@ -1288,16 +1308,16 @@ ever get that far.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP27">&#167;27</a>.</p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP27_3"></a><b>&#167;27.3. </b>The potential for disaster if this algorithm should be incorrect is high,
<p class="inwebparagraph"><a id="SP28_3"></a><b>&#167;28.3. </b>The potential for disaster if this algorithm should be incorrect is high,
so we perform a quick count to see if everything made it onto the list
and produce an internal error if not.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Verify that the search list indeed contains every noun just once</span> <span class="cwebmacronumber">27.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Verify that the search list indeed contains every noun just once</span> <span class="cwebmacronumber">28.3</span>&gt; =
</code></p>
@ -1317,9 +1337,9 @@ and produce an internal error if not.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP27">&#167;27</a>.</p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>The following adds all nametags under heading H to the search list, using
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>The following adds all nametags under heading H to the search list, using
its own list of contents, and then recurses to add all objects under
subheadings of H other than the one which has just recursed up to H. With
that done, we recurse up to the superheading of H.
@ -1360,7 +1380,7 @@ number of nametags in the source text.
<span class="identifier">LOOP_OVER_NOUNS_UNDER</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Nouns::priority</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">) == </span><span class="identifier">p</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Add tag to the end of the search list</span> <span class="cwebmacronumber">28.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add tag to the end of the search list</span> <span class="cwebmacronumber">29.1</span>&gt;<span class="plain">;</span>
<span class="comment">recurse downwards through subordinate headings, other than the way we came up</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">subhead</span><span class="plain"> = </span><span class="identifier">within</span><span class="plain">-</span><span class="element">&gt;child_heading</span><span class="plain">; </span><span class="identifier">subhead</span><span class="plain">; </span><span class="identifier">subhead</span><span class="plain"> = </span><span class="identifier">subhead</span><span class="plain">-</span><span class="element">&gt;next_heading</span><span class="plain">)</span>
@ -1375,10 +1395,10 @@ number of nametags in the source text.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::build_search_list_from is used in <a href="#SP27">&#167;27</a>.</p>
<p class="endnote">The function Sentences::Headings::build_search_list_from is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28_1"></a><b>&#167;28.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add tag to the end of the search list</span> <span class="cwebmacronumber">28.1</span>&gt; =
<p class="inwebparagraph"><a id="SP29_1"></a><b>&#167;29.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add tag to the end of the search list</span> <span class="cwebmacronumber">29.1</span>&gt; =
</code></p>
@ -1396,9 +1416,9 @@ number of nametags in the source text.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="endnote">This code is used in <a href="#SP29">&#167;29</a>.</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>The search list is used for finding best matches in a particular order, the
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>The search list is used for finding best matches in a particular order, the
order being used to break tie-breaks. Note that we return <code class="display"><span class="extract">NULL</span></code> if no noun
in the search list has a positive score.
</p>
@ -1426,7 +1446,7 @@ in the search list has a positive score.
<p class="endnote">The function Sentences::Headings::highest_scoring_noun_searched appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. Handling headings during the main traverses. </b>Here's what we do when we run into a heading, as we look through the
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Handling headings during the main traverses. </b>Here's what we do when we run into a heading, as we look through the
assertions in the source text: nothing, except to wipe out any meanings of
words like "it" left over from previous sentences. Headings are for
organisation, and are not directly functional in themselves.
@ -1446,7 +1466,7 @@ organisation, and are not directly functional in themselves.
<p class="endnote">The function Sentences::Headings::handle_heading appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Describing the heading structure, 1: to the debugging log. </b>Finally, three ways to describe the run of headings: to the debugging log,
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Describing the heading structure, 1: to the debugging log. </b>Finally, three ways to describe the run of headings: to the debugging log,
to the index of the project, and to a freestanding XML file.
</p>
@ -1469,7 +1489,7 @@ to the index of the project, and to a freestanding XML file.
<p class="endnote">The function Sentences::Headings::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>).</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>And here we log the whole heading tree by recursing through it, and
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>And here we log the whole heading tree by recursing through it, and
surreptitiously check that it is correctly formed at the same time.
</p>
@ -1495,11 +1515,11 @@ surreptitiously check that it is correctly formed at the same time.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::log_all_headings is used in <a href="#SP27_3">&#167;27.3</a>.</p>
<p class="endnote">The function Sentences::Headings::log_all_headings is used in <a href="#SP28_3">&#167;28.3</a>.</p>
<p class="endnote">The function Sentences::Headings::log_headings_recursively appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. Describing the heading structure, 2: to the index. </b></p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. Describing the heading structure, 2: to the index. </b></p>
<pre class="display">
@ -1521,7 +1541,7 @@ surreptitiously check that it is correctly formed at the same time.
<span class="plain">(</span><span class="identifier">ce</span><span class="plain">-</span><span class="element">&gt;heading_entered</span><span class="plain">-</span><span class="element">&gt;level</span><span class="plain"> &lt; </span><span class="identifier">min_positive_level</span><span class="plain">))</span>
<span class="identifier">min_positive_level</span><span class="plain"> = </span><span class="identifier">ce</span><span class="plain">-</span><span class="element">&gt;heading_entered</span><span class="plain">-</span><span class="element">&gt;level</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ce</span><span class="plain">, </span><span class="reserved">contents_entry</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Index this entry in the contents</span> <span class="cwebmacronumber">33.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index this entry in the contents</span> <span class="cwebmacronumber">34.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">contents_entry</span><span class="plain">) == 1) {</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">"(This would look more like a contents page if the source text "</span>
@ -1538,8 +1558,8 @@ surreptitiously check that it is correctly formed at the same time.
<p class="endnote">The function Sentences::Headings::index appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP33_1"></a><b>&#167;33.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index this entry in the contents</span> <span class="cwebmacronumber">33.1</span>&gt; =
<p class="inwebparagraph"><a id="SP34_1"></a><b>&#167;34.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index this entry in the contents</span> <span class="cwebmacronumber">34.1</span>&gt; =
</code></p>
@ -1582,14 +1602,14 @@ surreptitiously check that it is correctly formed at the same time.
<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>
&lt;<span class="cwebmacro">List all the objects and kinds created under the given heading, one tap stop deeper</span> <span class="cwebmacronumber">33.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">List all the objects and kinds created under the given heading, one tap stop deeper</span> <span class="cwebmacronumber">34.1.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP33">&#167;33</a>.</p>
<p class="endnote">This code is used in <a href="#SP34">&#167;34</a>.</p>
<p class="inwebparagraph"><a id="SP33_1_1"></a><b>&#167;33.1.1. </b>We index only headings of level 1 and up &mdash; so, not the pseudo-heading or the
<p class="inwebparagraph"><a id="SP34_1_1"></a><b>&#167;34.1.1. </b>We index only headings of level 1 and up &mdash; so, not the pseudo-heading or the
File (0) ones &mdash; and which are not within any extensions &mdash; so, are in the
primary source text written by the user.
</p>
@ -1627,16 +1647,16 @@ primary source text written by the user.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::index_heading_recursively is used in <a href="#SP33">&#167;33</a>.</p>
<p class="endnote">The function Sentences::Headings::index_heading_recursively is used in <a href="#SP34">&#167;34</a>.</p>
<p class="inwebparagraph"><a id="SP33_1_2"></a><b>&#167;33.1.2. </b>We skip any objects or kinds without names (i.e., whose <code class="display"><span class="extract">creator</span></code> is null).
<p class="inwebparagraph"><a id="SP34_1_2"></a><b>&#167;34.1.2. </b>We skip any objects or kinds without names (i.e., whose <code class="display"><span class="extract">creator</span></code> is null).
The rest appear in italic type, and without links to source text since this
in practice strews distractingly many orange berries across the page.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">List all the objects and kinds created under the given heading, one tap stop deeper</span> <span class="cwebmacronumber">33.1.2</span>&gt; =
&lt;<span class="cwebmacrodefn">List all the objects and kinds created under the given heading, one tap stop deeper</span> <span class="cwebmacronumber">34.1.2</span>&gt; =
</code></p>
@ -1658,9 +1678,9 @@ in practice strews distractingly many orange berries across the page.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP33_1">&#167;33.1</a>.</p>
<p class="endnote">This code is used in <a href="#SP34_1">&#167;34.1</a>.</p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. Describing the heading structure, 3: to a freestanding XML file. </b>This is provided as a convenience to the application using Inform, which may want
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Describing the heading structure, 3: to a freestanding XML file. </b>This is provided as a convenience to the application using Inform, which may want
to have a pull-down menu or similar gadget allowing the user to jump to a given
heading. This tells the interface where every heading is, thus saving it from
having to parse the source.
@ -1676,22 +1696,23 @@ Version", contains the Inform build number in its usual form: "4Q34", for instan
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::write_as_xml</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">xf_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = &amp;</span><span class="identifier">xf_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">filename_of_headings</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open headings file"</span><span class="plain">, </span><span class="identifier">filename_of_headings</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Task::xml_headings_file</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open headings file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">Sentences::Headings::write_headings_as_xml_inner</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::Headings::write_headings_as_xml_inner</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Write DTD indication for XML headings file</span> <span class="cwebmacronumber">34.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write DTD indication for XML headings file</span> <span class="cwebmacronumber">35.1</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;plist version=\</span><span class="plain">"</span><span class="string">1.0\</span><span class="plain">"</span><span class="string">&gt;&lt;dict&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;key&gt;Application Version&lt;/key&gt;&lt;string&gt;%B (build %B)&lt;/string&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;key&gt;%d&lt;/key&gt;&lt;dict&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">INDENT</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Write the dictionary of properties for a single heading</span> <span class="cwebmacronumber">34.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the dictionary of properties for a single heading</span> <span class="cwebmacronumber">35.2</span>&gt;<span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/dict&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
@ -1702,16 +1723,16 @@ Version", contains the Inform build number in its usual form: "4Q34", for instan
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::Headings::write_as_xml is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Sentences::Headings::write_as_xml is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Sentences::Headings::write_headings_as_xml_inner appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP34_1"></a><b>&#167;34.1. </b>We use a convenient Apple DTD:
<p class="inwebparagraph"><a id="SP35_1"></a><b>&#167;35.1. </b>We use a convenient Apple DTD:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write DTD indication for XML headings file</span> <span class="cwebmacronumber">34.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Write DTD indication for XML headings file</span> <span class="cwebmacronumber">35.1</span>&gt; =
</code></p>
@ -1723,9 +1744,9 @@ Version", contains the Inform build number in its usual form: "4Q34", for instan
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP34">&#167;34</a>.</p>
<p class="endnote">This code is used in <a href="#SP35">&#167;35</a>.</p>
<p class="inwebparagraph"><a id="SP34_2"></a><b>&#167;34.2. </b>Note that a level of 0, and a title of <code class="display"><span class="extract">--</span></code>, signifies a File (0) level
<p class="inwebparagraph"><a id="SP35_2"></a><b>&#167;35.2. </b>Note that a level of 0, and a title of <code class="display"><span class="extract">--</span></code>, signifies a File (0) level
heading: external tools can probably ignore such records. Similarly, it is
unlikely that they will ever see a record without a "Filename" key &mdash;
this would mean a heading arising from text created internally within Inform,
@ -1735,7 +1756,7 @@ but should this arise then the best recourse is to ignore the heading.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write the dictionary of properties for a single heading</span> <span class="cwebmacronumber">34.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Write the dictionary of properties for a single heading</span> <span class="cwebmacronumber">35.2</span>&gt; =
</code></p>
@ -1754,7 +1775,7 @@ but should this arise then the best recourse is to ignore the heading.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP34">&#167;34</a>.</p>
<p class="endnote">This code is used in <a href="#SP35">&#167;35</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="7-ss.html">Back to 'Structural Sentences'</a></li><li><a href="7-ns.html">Continue with 'Nonstructural Sentences'</a></li></ul><hr class="tocbar">

View file

@ -152,7 +152,7 @@ in quick succession, the second run-through does nothing.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::VPs::traverse is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Sentences::VPs::traverse is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Sentences::VPs::visit appears nowhere else.</p>
@ -678,7 +678,7 @@ new action.
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">translation</span><span class="plain">-</span><span class="identifier">target</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt;(</span><span class="identifier">O2W</span><span class="plain">)) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="reserved">natural_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = (</span><span class="reserved">natural_language</span><span class="plain"> *) (&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain"> = (</span><span class="identifier">inform_language</span><span class="plain"> *) (&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">definite</span><span class="plain">&gt;(</span><span class="identifier">SW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>

View file

@ -90,7 +90,7 @@ not be treated as a possessive, and expunge them.
<p class="endnote">The function Sentences::Rearrangement::further_material appears nowhere else.</p>
<p class="endnote">The function Sentences::Rearrangement::tidy_up_ofs_and_froms is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Sentences::Rearrangement::tidy_up_ofs_and_froms is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following array is used only by Traversals 1 to 3, and is how we
remember direction names.

View file

@ -41,7 +41,7 @@ constructs them:
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">constant_verb_form</span><span class="plain">, </span><span class="identifier">verb_form</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">control_structure_used</span><span class="plain">, </span><span class="reserved">control_structure_phrase</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">creation_proposition</span><span class="plain">, </span><span class="reserved">pcalc_prop</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">defn_language</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">defn_language</span><span class="plain">, </span><span class="identifier">inform_language</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">embodying_heading</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">end_control_structure_used</span><span class="plain">, </span><span class="reserved">control_structure_phrase</span><span class="plain">)</span>
<span class="identifier">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">evaluation</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain">)</span>
@ -103,7 +103,7 @@ to provide their get and set functions:
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">constant_verb_form</span><span class="plain">, </span><span class="identifier">verb_form</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">control_structure_used</span><span class="plain">, </span><span class="reserved">control_structure_phrase</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">creation_proposition</span><span class="plain">, </span><span class="reserved">pcalc_prop</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">defn_language</span><span class="plain">, </span><span class="reserved">natural_language</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">defn_language</span><span class="plain">, </span><span class="identifier">inform_language</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">embodying_heading</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">end_control_structure_used</span><span class="plain">, </span><span class="reserved">control_structure_phrase</span><span class="plain">)</span>
<span class="identifier">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain">(</span><span class="identifier">evaluation</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain">)</span>
@ -290,7 +290,7 @@ goes. The annotations used are identified by nonzero ID numbers, as follows:
<span class="definitionkeyword">enum</span> <span class="constant">converted_SN_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">int</span></code>: marking descriptions</span>
<span class="definitionkeyword">enum</span> <span class="constant">creation_proposition_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">pcalc_prop</span></code>: proposition which newly created value satisfies</span>
<span class="definitionkeyword">enum</span> <span class="constant">creation_site_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">int</span></code>: whether an instance was created from this node</span>
<span class="definitionkeyword">enum</span> <span class="constant">defn_language_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">natural_language</span></code>: what language this definition is in</span>
<span class="definitionkeyword">enum</span> <span class="constant">defn_language_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">inform_language</span></code>: what language this definition is in</span>
<span class="definitionkeyword">enum</span> <span class="constant">embodying_heading_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">heading</span></code>: for parse nodes of headings</span>
<span class="definitionkeyword">enum</span> <span class="constant">end_control_structure_used_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">control_structure_phrase</span></code>: for CODE BLOCK nodes only</span>
<span class="definitionkeyword">enum</span> <span class="constant">epistemological_status_ANNOT</span><span class="plain"> </span> <span class="comment"><code class="display"><span class="extract">int</span></code>: a bitmap of results from checking an ambiguous reading</span>
@ -862,7 +862,7 @@ be such that their head nodes each pass this test:
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ParseTreeUsage::write_to_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">ParseTree::write_to_file</span><span class="plain">(</span><span class="identifier">filename_of_parse_tree</span><span class="plain">);</span>
<span class="identifier">ParseTree::write_to_file</span><span class="plain">(</span><span class="functiontext">Task::parse_tree_file</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ParseTreeUsage::plant_parse_tree</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">ParseTree::plant_parse_tree</span><span class="plain">();</span>
@ -879,11 +879,11 @@ be such that their head nodes each pass this test:
<p class="endnote">The function ParseTreeUsage::write_to_file appears nowhere else.</p>
<p class="endnote">The function ParseTreeUsage::plant_parse_tree is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function ParseTreeUsage::plant_parse_tree is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function ParseTreeUsage::verify is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function ParseTreeUsage::verify is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function ParseTreeUsage::write_main_source_to_log is used in 1/mr (<a href="1-mr.html#SP4_18">&#167;4.18</a>).</p>
<p class="endnote">The function ParseTreeUsage::write_main_source_to_log is used in 1/mr (<a href="1-mr.html#SP1_5">&#167;1.5</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p>

View file

@ -83,7 +83,7 @@ on childless nodes, it cannot ever act on the same node twice.
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::RuleSubtrees::register_recently_lexed_phrases is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>), 5/lp (<a href="5-lp.html#SP40">&#167;40</a>, <a href="5-lp.html#SP41">&#167;41</a>), 7/oaf (<a href="7-oaf.html#SP3">&#167;3</a>), 15/ma (<a href="15-ma.html#SP11_4">&#167;11.4</a>).</p>
<p class="endnote">The function Sentences::RuleSubtrees::register_recently_lexed_phrases is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>), 5/lp (<a href="5-lp.html#SP40">&#167;40</a>, <a href="5-lp.html#SP41">&#167;41</a>), 7/oaf (<a href="7-oaf.html#SP3">&#167;3</a>), 15/ma (<a href="15-ma.html#SP11_4">&#167;11.4</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Command nodes are demoted to be children of routine nodes:
</p>
@ -2181,7 +2181,7 @@ are added, they can fairly simply be put here.
<p class="endnote">The function Sentences::RuleSubtrees::csp_new appears nowhere else.</p>
<p class="endnote">The function Sentences::RuleSubtrees::create_standard_csps is used in 1/mr (<a href="1-mr.html#SP4_9">&#167;4.9</a>).</p>
<p class="endnote">The function Sentences::RuleSubtrees::create_standard_csps is used in 1/htc (<a href="1-htc.html#SP2_2">&#167;2.2</a>).</p>
<p class="endnote">The function Sentences::RuleSubtrees::log_control_structure is used in 7/ptu (<a href="7-ptu.html#SP17_2">&#167;17.2</a>).</p>

View file

@ -11,7 +11,7 @@
<!--Weave of '7/ss' 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#7">Chapter 7: Sentences</a></li><li><b>Structural Sentences</b></li></ul><p class="purpose">To parse structurally important sentences.</p>
<ul class="toc"><li><a href="#SP7">&#167;7. Sentence division</a></li><li><a href="#SP8">&#167;8. Sentence breaking</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP2">&#167;2. Sentence division</a></li><li><a href="#SP6">&#167;6. Sentence breaking</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
@ -20,7 +20,13 @@
<span class="definitionkeyword">define</span> <span class="constant">list_node_type</span><span class="plain"> </span><span class="constant">ROUTINE_NT</span>
<span class="definitionkeyword">define</span> <span class="constant">list_entry_node_type</span><span class="plain"> </span><span class="constant">INVOCATION_LIST_NT</span>
</pre>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Sentence division. </b>Sentence division can happen either early in Inform's run, when the vast bulk
of the source text is read, or at intermittent periods later when fresh text
is generated internally. New sentences need to be treated slightly differently
in these cases, so this seems as good a point as any to define the routine
which the <code class="display"><span class="extract">.i6t</span></code> interpreter calls when it wants to signal that the source
text has now officially been read.
</p>
<pre class="definitions">
@ -28,6 +34,11 @@
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">text_loaded_from_source</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">StructuralSentences::declare_source_loaded</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">text_loaded_from_source</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">StructuralSentences::annotate_new_sentence</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_loaded_from_source</span><span class="plain">) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="identifier">sentence_unparsed_ANNOT</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
@ -38,6 +49,8 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function StructuralSentences::declare_source_loaded is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function StructuralSentences::annotate_new_sentence appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -67,7 +80,7 @@
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">StructuralSentences::new_beginend</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">StructuralSentences::new_beginend</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">new</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">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">) == </span><span class="identifier">BEGINHERE_NT</span><span class="plain">)</span>
<span class="functiontext">Extensions::Inclusion::check_begins_here</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="identifier">sfsm_extension</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">) == </span><span class="identifier">ENDHERE_NT</span><span class="plain">)</span>
@ -98,32 +111,7 @@
<p class="endnote">The function StructuralSentences::new_language appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">EXTENSION_FILE_TYPE</span><span class="plain"> </span><span class="reserved">extension_file</span>
</pre>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Sentence division. </b>Sentence division can happen either early in Inform's run, when the vast bulk
of the source text is read, or at intermittent periods later when fresh text
is generated internally. New sentences need to be treated slightly differently
in these cases, so this seems as good a point as any to define the routine
which the <code class="display"><span class="extract">.i6t</span></code> interpreter calls when it wants to signal that the source
text has now officially been read.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">StructuralSentences::declare_source_loaded</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">text_loaded_from_source</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function StructuralSentences::declare_source_loaded is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Sentence breaking. </b>The <code class="display"><span class="extract">Sentences::break</span></code> routine is used for long stretches of text,
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Sentence breaking. </b>The <code class="display"><span class="extract">Sentences::break</span></code> routine is used for long stretches of text,
normally entire files. The following provides a way for the <code class="display"><span class="extract">.i6t</span></code>
interpreter to apply it to the whole text as lexed, which provides the
original basis for parsing. (This won't be the entire source text,
@ -137,6 +125,7 @@ though: extensions, including the Standard Rules, have yet to be read.)
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">language_definition_top</span><span class="plain"> &gt;= </span><span class="identifier">n</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">language_definition_top</span><span class="plain">+1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">doc_references_top</span><span class="plain"> &gt;= </span><span class="identifier">n</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">doc_references_top</span><span class="plain">+1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">language_scan_top</span><span class="plain"> &gt;= </span><span class="identifier">n</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">language_scan_top</span><span class="plain">+1;</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">lexer_wordcount</span><span class="plain">-1), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">implicit_heading</span><span class="plain"> = </span><span class="identifier">ParseTree::new</span><span class="plain">(</span><span class="identifier">HEADING_NT</span><span class="plain">);</span>
@ -150,9 +139,9 @@ though: extensions, including the Standard Rules, have yet to be read.)
<p class="inwebparagraph"></p>
<p class="endnote">The function StructuralSentences::break_source is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function StructuralSentences::break_source is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Sentences in the source text are of five categories: dividing sentences,
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Sentences in the source text are of five categories: dividing sentences,
which divide up the source into segments; structural sentences, which split
the source into different forms (standard text, tables, equations, I6 matter,
and so on); nonstructural sentences, which make grammatical definitions and
@ -206,14 +195,14 @@ source text.
<span class="identifier">section</span><span class="plain"> ... ==&gt; 5</span>
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">end</span><span class="plain">-</span><span class="identifier">marker</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">begin</span><span class="plain">/</span><span class="identifier">begins</span><span class="plain"> </span><span class="identifier">here</span><span class="plain"> | ==&gt; -1; </span>&lt;<span class="cwebmacro">Check we can begin an extension here</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="plain">... </span><span class="identifier">end</span><span class="plain">/</span><span class="identifier">ends</span><span class="plain"> </span><span class="identifier">here</span><span class="plain"> ==&gt; -2; </span>&lt;<span class="cwebmacro">Check we can end an extension here</span> <span class="cwebmacronumber">9.2</span>&gt;<span class="plain">;</span>
<span class="plain">... </span><span class="identifier">begin</span><span class="plain">/</span><span class="identifier">begins</span><span class="plain"> </span><span class="identifier">here</span><span class="plain"> | ==&gt; -1; </span>&lt;<span class="cwebmacro">Check we can begin an extension here</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
<span class="plain">... </span><span class="identifier">end</span><span class="plain">/</span><span class="identifier">ends</span><span class="plain"> </span><span class="identifier">here</span><span class="plain"> ==&gt; -2; </span>&lt;<span class="cwebmacro">Check we can end an extension here</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check we can begin an extension here</span> <span class="cwebmacronumber">9.1</span>&gt; =
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check we can begin an extension here</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
@ -229,16 +218,16 @@ source text.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP9_2"></a><b>&#167;9.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check we can end an extension here</span> <span class="cwebmacronumber">9.2</span>&gt; =
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check we can end an extension here</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">sfsm_extension_position</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtEndsWithoutBegins</span><span class="plain">),</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">),</span>
<span class="identifier">sfsm_extension</span><span class="plain">, </span><span class="string">"has an 'ends here' with nothing having begun"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">sfsm_extension_position</span><span class="plain">++; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtMultipleEndsHere</span><span class="plain">),</span>
@ -248,7 +237,7 @@ source text.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP_1"></a><b>&#167;.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Detect a dividing sentence</span> <span class="cwebmacronumber">.1</span>&gt; =
@ -274,7 +263,7 @@ source text.
<p class="endnote">This code is never used.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Structural sentences are defined as follows. (The asterisk notation isn't
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Structural sentences are defined as follows. (The asterisk notation isn't
known to most Inform users: it increases output to the debugging log.)
</p>
@ -294,7 +283,7 @@ known to most Inform users: it increases output to the debugging log.)
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Properly speaking, despite the definition above, language modifying sentences
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Properly speaking, despite the definition above, language modifying sentences
are nonstructural. So what are they doing here? The answer is that we need to
read them early on, because they affect the way that they parse all other
sentences. Whereas other nonstructural sentences can wait, these can't.
@ -309,7 +298,7 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="definitions">
@ -371,22 +360,22 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtNoBeginsHere_SYNERROR</span><span class="plain">: {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = (</span><span class="reserved">extension_file</span><span class="plain"> *) </span><span class="identifier">ref</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">inform_extension</span><span class="plain"> *) </span><span class="identifier">ref</span><span class="plain">;</span>
<span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtNoBeginsHere</span><span class="plain">),</span>
<span class="identifier">ef</span><span class="plain">, </span><span class="string">"has no 'begins here' sentence"</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">, </span><span class="string">"has no 'begins here' sentence"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtNoEndsHere_SYNERROR</span><span class="plain">: {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = (</span><span class="reserved">extension_file</span><span class="plain"> *) </span><span class="identifier">ref</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">inform_extension</span><span class="plain"> *) </span><span class="identifier">ref</span><span class="plain">;</span>
<span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtNoEndsHere</span><span class="plain">),</span>
<span class="identifier">ef</span><span class="plain">, </span><span class="string">"has no 'ends here' sentence"</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">, </span><span class="string">"has no 'ends here' sentence"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtSpuriouslyContinues_SYNERROR</span><span class="plain">: {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = (</span><span class="reserved">extension_file</span><span class="plain"> *) </span><span class="identifier">ref</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">inform_extension</span><span class="plain"> *) </span><span class="identifier">ref</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Spurious text: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Problems::Issue::extension_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtSpuriouslyContinues</span><span class="plain">),</span>
<span class="identifier">ef</span><span class="plain">, </span><span class="string">"continues after the 'ends here' sentence"</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">, </span><span class="string">"continues after the 'ends here' sentence"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HeadingOverLine_SYNERROR</span><span class="plain">:</span>

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@
<!--Weave of '8/ie' 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>Including Extensions</b></li></ul><p class="purpose">To fulfill requests to include extensions, adding their material to the parse tree as needed, and removing INCLUDE nodes.</p>
<ul class="toc"><li><a href="#SP5">&#167;5. Extension loading</a></li><li><a href="#SP6">&#167;6. Parsing extension version numbers</a></li><li><a href="#SP7">&#167;7. Checking the begins here and ends here sentences</a></li><li><a href="#SP11">&#167;11. Sentence handlers for begins here and ends here</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP5">&#167;5. Extension loading</a></li><li><a href="#SP7">&#167;7. Checking the begins here and ends here sentences</a></li><li><a href="#SP11">&#167;11. Sentence handlers for begins here and ends here</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>At this point in the narrative of a typical run of Inform, we have read in the
source text supplied by the user. The lexer automatically prefaced this with
@ -58,7 +58,7 @@ guaranteed to be no INCLUDE nodes remaining in the parse tree.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Inclusion::traverse is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Extensions::Inclusion::traverse is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Extensions::Inclusion::visit appears nowhere else.</p>
@ -200,12 +200,26 @@ parse tree.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">version_word</span><span class="plain"> &gt;= 0)</span>
<span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="identifier">version_word</span><span class="plain">); </span> <span class="comment">this checks the formatting of the version number</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">requested_extension</span><span class="plain"> =</span>
<span class="functiontext">Extensions::Inclusion::load</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">version_word</span><span class="plain">, </span><span class="identifier">RW</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">exft</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">WRITE_TO</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">);</span>
<span class="identifier">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="identifier">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">exft</span><span class="plain">, </span><span class="identifier">exfa</span><span class="plain">);</span>
<span class="identifier">Works::add_to_database</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">LOADED_WDBC</span><span class="plain">);</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">min</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">version_word</span><span class="plain"> &gt;= 0) </span><span class="identifier">min</span><span class="plain"> = </span><span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="identifier">version_word</span><span class="plain">);</span>
<span class="identifier">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="identifier">Requirements::new</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">min</span><span class="plain">, </span><span class="identifier">VersionNumbers::null</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">requested_extension</span><span class="plain">-</span><span class="element">&gt;body_text_unbroken</span><span class="plain">) {</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">requested_extension</span><span class="plain">-</span><span class="element">&gt;body_text</span><span class="plain">, </span><span class="identifier">requested_extension</span><span class="plain">);</span>
<span class="identifier">requested_extension</span><span class="plain">-</span><span class="element">&gt;body_text_unbroken</span><span class="plain"> = </span><span class="identifier">FALSE</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="functiontext">Extensions::Inclusion::load</span><span class="plain">(</span><span class="identifier">req</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::set_inclusion_sentence</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Extensions::set_VM_text</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">RW</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">E</span><span class="plain">) &amp;&amp; (</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">body_text_unbroken</span><span class="plain">)) {</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">body_text</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">body_text_unbroken</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -218,23 +232,19 @@ parse tree.
<pre class="display">
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="functiontext">Extensions::Inclusion::load</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">T</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">version_word</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">VMW</span><span class="plain">) {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;author_text</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)))</span>
&lt;<span class="cwebmacro">This is an extension already loaded, so note any version number hike and return</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="functiontext">Extensions::Inclusion::load</span><span class="plain">(</span><span class="identifier">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">) {</span>
<span class="functiontext">NaturalLanguages::scan</span><span class="plain">(); </span> <span class="comment">to avoid wording from those interleaving with extension wording</span>
&lt;<span class="cwebmacro">Do not load the same extension work twice</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
<span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">Extensions::Files::new</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">VMW</span><span class="plain">, </span><span class="identifier">version_word</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0)</span>
&lt;<span class="cwebmacro">Read the extension file into the lexer, and break it into body and documentation</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ef</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">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Read the extension file into the lexer, and break it into body and documentation</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Inclusion::load is used in <a href="#SP4_1">&#167;4.1</a>, 8/ed2 (<a href="8-ed2.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function Extensions::Inclusion::load is used in <a href="#SP4_1">&#167;4.1</a>.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>Note that we ignore a request for an extension which has already been
loaded, except if the new request ups the ante in terms of the minimum
@ -255,17 +265,17 @@ can't know at load time what we will ultimately require.)
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">This is an extension already loaded, so note any version number hike and return</span> <span class="cwebmacronumber">5.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Do not load the same extension work twice</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;min_version_needed</span><span class="plain">) &lt;</span>
<span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="identifier">version_word</span><span class="plain">)) {</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;min_version_needed</span><span class="plain"> = </span><span class="identifier">version_word</span><span class="plain">;</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;inclusion_sentence</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ef</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">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">Requirements::meets</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">, </span><span class="identifier">req</span><span class="plain">)) {</span>
<span class="identifier">Extensions::must_satisfy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -283,187 +293,113 @@ trap-door into Read Source Text, to seek and open the file.
<pre class="displaydefn">
<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">5.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="functiontext">SourceFiles::read_extension_source_text</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">census_mode</span><span class="plain">)) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ORIGIN_WAS_USER_EXTENSIONS_AREA</span><span class="plain">:</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA</span><span class="plain">:</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span> <span class="comment">which can happen if the extension file cannot be found</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found_to_be_malformed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="identifier">allow_malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">inbuild_search_result</span><span class="plain">);</span>
<span class="identifier">Nests::search_for</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">search_result</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">, </span><span class="identifier">inbuild_search_result</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="identifier">E</span><span class="plain"> = </span><span class="identifier">ExtensionManager::from_copy</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">origin</span><span class="plain"> = </span><span class="identifier">Nests::get_tag</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">-&gt;</span><span class="identifier">nest</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">origin</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MATERIALS_NEST_TAG</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXTERNAL_NEST_TAG</span><span class="plain">:</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INTERNAL_NEST_TAG</span><span class="plain">:</span>
<span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">loaded_from_built_in_area</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">-&gt;</span><span class="identifier">copy</span><span class="plain">-&gt;</span><span class="identifier">errors_reading_source_text</span><span class="plain">) &gt; 0) {</span>
<span class="functiontext">SourceFiles::issue_problems_arising</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">-&gt;</span><span class="identifier">copy</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">found_to_be_malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_to_be_malformed</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">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Issue a cannot-find problem</span> <span class="cwebmacronumber">5.2.1</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">SourceFiles::read</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">EXW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</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">EXW</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">5.2.3</span>&gt;<span class="character">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2_1"></a><b>&#167;5.2.1. </b>We concoct a textual synopsis in the form
</p>
<p class="inwebparagraph"></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">5.2.1</span>&gt; =
<p class="inwebparagraph"><a id="SP5_2_1"></a><b>&#167;5.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue a cannot-find problem</span> <span class="cwebmacronumber">5.2.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">"%+W by %+W"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<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="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP5_2_2"></a><b>&#167;5.2.2. </b>If an extension file contains the special text (outside literal mode) of
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">---- Documentation ----</span>
</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="SP5_2_3"></a><b>&#167;5.2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">5.2.3</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>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;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;, 1);</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">ef</span><span class="plain">-</span><span class="element">&gt;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;, 2);</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Parsing extension version numbers. </b>Extensions can have versions in the form N/DDDDDD, a format which was chosen
for sentimental reasons: IF enthusiasts know it well from the banner text of
the Infocom titles of the 1980s. This story file, for instance, was compiled
at the time of the Reykjavik summit between Presidents Gorbachev and Reagan:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Moonmist</span>
<span class="plain">Infocom interactive fiction - a mystery story</span>
<span class="plain">Copyright (c) 1986 by Infocom, Inc. All rights reserved.</span>
<span class="plain">Moonmist is a trademark of Infocom, Inc.</span>
<span class="plain">Release number 9 / Serial number 861022</span>
</pre>
<p class="inwebparagraph">Story file collectors customarily abbreviate this in catalogues to <code class="display"><span class="extract">9/861022</span></code>.
</p>
<p class="inwebparagraph">In our scheme, DDDDDD can be omitted (in which case so must the slash be).
Spacing is not allowed around the slash (if present), so the version number
always occupies a single lexical word.
</p>
<p class="inwebparagraph">The following routine parses the version number at word <code class="display"><span class="extract">vwn</span></code> to give an
non-negative integer &mdash; in fact it really just construes the whole thing,
with the slash removed, as a 7-digit number &mdash; in such a way that an earlier
version always has a lower integer than a later one. It is legal for <code class="display"><span class="extract">vwn</span></code>
to be -1, which means "no version number quoted", and evaluates as
0 &mdash; corresponding to <code class="display"><span class="extract">0/000000</span></code>, lower than the lowest version number it is
legal to quote explicitly, which is <code class="display"><span class="extract">1</span></code>. (It follows that requiring no
version in particular is equivalent to requiring <code class="display"><span class="extract">0/000000</span></code> or better, since
every extension passes that test.)
</p>
<p class="inwebparagraph">In order that the numerical form of a version number should be a signed
32-bit integer which does not overflow, we require that the release number
<code class="display"><span class="extract">N</span></code> be at most 999. It could in fact rise to 2146 without incident, but
it seems cleaner to constrain the number of digits than the value.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_VERSION_NUMBER_LENGTH</span><span class="plain"> 10 </span> <span class="comment">for <code class="display"><span class="extract">999/991231</span></code></span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">vwn</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">slashes</span><span class="plain"> = 0, </span><span class="identifier">digits</span><span class="plain"> = 0, </span><span class="identifier">slash_at</span><span class="plain"> = 0;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, *</span><span class="identifier">q</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vwn</span><span class="plain"> == -1) </span><span class="reserved">return</span><span class="plain"> 0; </span> <span class="comment">an unspecified version equates to <code class="display"><span class="extract">0/000000</span></code></span>
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">vwn</span><span class="plain">); </span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] != 0; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'/'</span><span class="plain">) {</span>
<span class="identifier">slashes</span><span class="plain">++; </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> == 0) || (</span><span class="identifier">slashes</span><span class="plain"> &gt; 1)) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Malformed</span><span class="plain">;</span>
<span class="identifier">slash_at</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">+1;</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">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]))) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Malformed</span><span class="plain">;</span>
<span class="identifier">digits</span><span class="plain">++;</span>
<span class="identifier">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req2</span><span class="plain"> = </span><span class="identifier">Requirements::any_version_of</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">inbuild_search_result</span><span class="plain">);</span>
<span class="identifier">Nests::search_for</span><span class="plain">(</span><span class="identifier">req2</span><span class="plain">, </span><span class="identifier">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">) == 0) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Author: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</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>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Title: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</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">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</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">PM_BogusExtension</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I can't find the extension requested by: %1. %P"</span>
<span class="string">"You can get hold of extensions which people have made public at "</span>
<span class="string">"the Inform website, www.inform7.com, or by using the Public "</span>
<span class="string">"Library in the Extensions panel."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">versions</span><span class="plain">);</span>
<span class="identifier">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">search_result</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">, </span><span class="identifier">inbuild_search_result</span><span class="plain">, </span><span class="identifier">L</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">versions</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">versions</span><span class="plain">, </span><span class="string">" or "</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">search_result</span><span class="plain">-&gt;</span><span class="identifier">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">WRITE_TO</span><span class="plain">(</span><span class="identifier">versions</span><span class="plain">, </span><span class="string">"an unnumbered version"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">versions</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'0'</span><span class="plain">) || (</span><span class="identifier">digits</span><span class="plain"> == 0)) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Malformed</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(2, </span><span class="identifier">versions</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">PM_ExtVersionTooLow</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I can't find the right version of the extension requested by %1 - "</span>
<span class="string">"I can only find %2. %P"</span>
<span class="string">"You can get hold of extensions which people have made public at "</span>
<span class="string">"the Inform website, www.inform7.com, or by using the Public "</span>
<span class="string">"Library in the Extensions panel."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">versions</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">slashes</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">digits</span><span class="plain"> &lt;= 3)) </span> <span class="comment">so that <code class="display"><span class="extract">p</span></code> points to 1 to 3 digits, not starting with <code class="display"><span class="extract">0</span></code></span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wide::atoi</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)*1000000;</span>
<span class="identifier">p</span><span class="plain">[</span><span class="identifier">slash_at</span><span class="plain">] = 0; </span> <span class="comment">temporarily replace the slash with a null, making <code class="display"><span class="extract">p</span></code> and <code class="display"><span class="extract">q</span></code> distinct C strings</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) &gt; 3) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Malformed</span><span class="plain">; </span> <span class="comment">now <code class="display"><span class="extract">p</span></code> points to 1 to 3 digits, not starting with <code class="display"><span class="extract">0</span></code></span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">) != 6) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Malformed</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (*</span><span class="identifier">q</span><span class="plain"> == </span><span class="character">'0'</span><span class="plain">) </span><span class="identifier">q</span><span class="plain">++; </span> <span class="comment">now <code class="display"><span class="extract">q</span></code> points to 0 to 6 digits, not starting with <code class="display"><span class="extract">0</span></code></span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q</span><span class="plain">[0] == 0) </span><span class="identifier">q</span><span class="plain">--; </span> <span class="comment">if it was 0 digits, backspace to make it a single digit <code class="display"><span class="extract">0</span></code></span>
<span class="identifier">rv</span><span class="plain"> = (</span><span class="identifier">Wide::atoi</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)*1000000) + </span><span class="identifier">Wide::atoi</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">);</span>
<span class="identifier">p</span><span class="plain">[</span><span class="identifier">slash_at</span><span class="plain">] = </span><span class="character">'/'</span><span class="plain">; </span> <span class="comment">put the slash back over the null byte temporarily dividing the string</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<p class="inwebparagraph"></p>
<span class="identifier">Malformed</span><span class="plain">: </span>&lt;<span class="cwebmacro">Issue a problem message for a malformed version number</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<p class="endnote">This code is used in <a href="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_PM_ExtVersionMalformed_at</span><span class="plain"> = -1;</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">vwn</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>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">vwn</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">version</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">semantic_version_number_holder</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = (</span><span class="identifier">semantic_version_number_holder</span><span class="plain"> *) &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">V</span><span class="plain"> = </span><span class="identifier">H</span><span class="plain">-&gt;</span><span class="identifier">version</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Issue a problem message for a malformed version number</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Inclusion::parse_version is used in <a href="#SP4_1">&#167;4.1</a>, <a href="#SP5_1">&#167;5.1</a>, <a href="#SP9">&#167;9</a>, 8/ef (<a href="8-ef.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Extensions::Inclusion::parse_version is used in <a href="#SP4_1">&#167;4.1</a>.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>Because we tend to call <code class="display"><span class="extract">Extensions::Inclusion::parse_version</span></code> repeatedly on the same word, we
want to recover tidily from this problem, and not report it over and over.
We do this by altering the text to <code class="display"><span class="extract">1</span></code>, the lowest well-formed version
number text.
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>Because we tend to call <code class="display"><span class="extract">Extensions::Inclusion::parse_version</span></code> repeatedly on
the same word, we want to recover tidily from this problem, and not report it
over and over. We do this by altering the text to <code class="display"><span class="extract">1</span></code>, the lowest well-formed
version number text.
</p>
@ -473,14 +409,15 @@ number text.
<pre class="displaydefn">
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Offending word number %d &lt;%N&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">vwn</span><span class="plain">, </span><span class="identifier">vwn</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtVersionMalformed</span><span class="plain">),</span>
<span class="string">"a version number must have the form N/DDDDDD"</span><span class="plain">,</span>
<span class="string">"as in the example '2/040426' for release 2 made on 26 April 2004. "</span>
<span class="string">"(The DDDDDD part is optional, so '3' is a legal version number too. "</span>
<span class="string">"N must be between 1 and 999: in particular, there is no version 0.)"</span><span class="plain">);</span>
<span class="identifier">Vocabulary::change_text_of_word</span><span class="plain">(</span><span class="identifier">vwn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"1"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> 1000000; </span> <span class="comment">which equates to <code class="display"><span class="extract">1/000000</span></code></span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_PM_ExtVersionMalformed_at</span><span class="plain"> != </span><span class="identifier">vwn</span><span class="plain">) {</span>
<span class="identifier">last_PM_ExtVersionMalformed_at</span><span class="plain"> = </span><span class="identifier">vwn</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Offending word number %d &lt;%N&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">vwn</span><span class="plain">, </span><span class="identifier">vwn</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExtVersionMalformed</span><span class="plain">),</span>
<span class="string">"a version number must have the form N/DDDDDD"</span><span class="plain">,</span>
<span class="string">"as in the example '2/040426' for release 2 made on 26 April 2004. "</span>
<span class="string">"(The DDDDDD part is optional, so '3' is a legal version number too. "</span>
<span class="string">"N must be between 1 and 999: in particular, there is no version 0.)"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -520,19 +457,19 @@ problem messages if it is malformed.
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">begins</span><span class="plain">-</span><span class="identifier">here</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">title</span><span class="plain">-</span><span class="identifier">and</span><span class="plain">-</span><span class="identifier">version</span><span class="plain">&gt; </span><span class="identifier">by</span><span class="plain"> ... | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">auth1</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1]); &lt;&lt;</span><span class="identifier">auth2</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1]);</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ExtMiswordedBeginsHere problem</span> <span class="cwebmacronumber">8.1</span>&gt;
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue problem</span> <span class="cwebmacronumber">8.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ExtMiswordedBeginsHere problem</span> <span class="cwebmacronumber">8.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Issue problem</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">&lt;&lt;</span><span class="identifier">auth1</span><span class="plain">&gt;&gt; = -1; &lt;&lt;</span><span class="identifier">auth2</span><span class="plain">&gt;&gt; = -1;</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">PM_ExtMiswordedBeginsHere</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> <span class="comment">since inbuild's scan catches this first</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"has a misworded 'begins here' sentence ('%2'), which contains "</span>
<span class="string">"no 'by'. Recall that every extension should begin with a "</span>
@ -550,26 +487,15 @@ problem messages if it is malformed.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::check_begins_here</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::check_begins_here</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</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">current_sentence</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">; </span> <span class="comment">in case problem messages need to be issued</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">));</span>
<span class="plain">&lt;</span><span class="identifier">begins</span><span class="plain">-</span><span class="identifier">here</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</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">Wordings::new</span><span class="plain">(&lt;&lt;</span><span class="identifier">t1</span><span class="plain">&gt;&gt;, &lt;&lt;</span><span class="identifier">t2</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">Wordings::new</span><span class="plain">(&lt;&lt;</span><span class="identifier">auth1</span><span class="plain">&gt;&gt;, &lt;&lt;</span><span class="identifier">auth2</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</span><span class="plain"> = </span><span class="identifier">Wordings::new</span><span class="plain">(&lt;&lt;</span><span class="identifier">rest1</span><span class="plain">&gt;&gt;, &lt;&lt;</span><span class="identifier">rest2</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">Extensions::set_VM_text</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">Wordings::new</span><span class="plain">(&lt;&lt;</span><span class="identifier">rest1</span><span class="plain">&gt;&gt;, &lt;&lt;</span><span class="identifier">rest2</span><span class="plain">&gt;&gt;));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain"> &gt;= 0) </span><span class="functiontext">Extensions::Inclusion::parse_version</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</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">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Check that the extension's stipulation about the virtual machine can be met</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;author_text</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Issue a problem message pointing out that name and author do not agree with filename</span> <span class="cwebmacronumber">9.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Check that the extension's stipulation about the virtual machine can be met</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="character">;</span>
<span class="plain">}</span>
</pre>
@ -589,74 +515,16 @@ with our VM de jour.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">&gt;(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</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="constant">PLATFORM_UNMET_HQ</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a problem message saying that the VM does not meet requirements</span> <span class="cwebmacronumber">9.1.2</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Issue a problem message saying that the VM requirements are malformed</span> <span class="cwebmacronumber">9.1.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">compatibility_specification</span><span class="plain"> *</span><span class="identifier">C</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">compatibility</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Compatibility::with</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">Task::vm</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a problem message saying that the VM does not meet requirements</span> <span class="cwebmacronumber">9.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_2"></a><b>&#167;9.2. </b>Suppose we wanted Onion Cookery by Delia Smith. We loaded the extension
file called Onion Cookery in the Delia Smith folder of the (probably external)
extensions area: but suppose that file turns out instead to be French Cuisine
by Elizabeth David, according to its "begins here" sentence? Then the
following problem message is produced:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem message pointing out that name and author do not agree with filename</span> <span class="cwebmacronumber">9.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</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">PM_ExtMisidentified</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"The extension %1, which your source text makes use of, seems to be "</span>
<span class="string">"misidentified: its 'begins here' sentence declares it as '%2'. "</span>
<span class="string">"(Perhaps it was wrongly installed?)"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b>See Virtual Machines for the grammar of what can be given as a VM
requirement.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem message saying that the VM requirements are malformed</span> <span class="cwebmacronumber">9.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</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">PM_ExtMalformedVM</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"Your source text makes use of the extension %1: but my copy "</span>
<span class="string">"stipulates that it is '%2', which is a description of the required "</span>
<span class="string">"story file format which I can't understand, and should be "</span>
<span class="string">"something like '(for Z-machine version 5 or 8 only)'."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>&#167;9.1.2. </b>Here the problem is not that the extension is broken in some way: it's
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b>Here the problem is not that the extension is broken in some way: it's
just not what we can currently use. Therefore the correction should be a
matter of removing the inclusion, not of altering the extension, so we
report this problem at the inclusion line.
@ -664,20 +532,19 @@ report this problem at the inclusion line.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem message saying that the VM does not meet requirements</span> <span class="cwebmacronumber">9.1.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Issue a problem message saying that the VM does not meet requirements</span> <span class="cwebmacronumber">9.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;inclusion_sentence</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>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;author_text</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(4, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_copy</span><span class="plain">(2, </span><span class="identifier">E</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">);</span>
<span class="identifier">Problems::quote_stream</span><span class="plain">(3, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">parsed_from</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">PM_ExtInadequateVM</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1: but my copy of %2 by %3 stipulates that it "</span>
<span class="string">"is '%4'. That means it can only be used with certain of "</span>
<span class="string">"You wrote %1: but my copy of %2 stipulates that it "</span>
<span class="string">"is '%3'. That means it can only be used with certain of "</span>
<span class="string">"the possible compiled story file formats, and at the "</span>
<span class="string">"moment, we don't fit the requirements. (You can change "</span>
<span class="string">"the format used for this project on the Settings panel.)"</span><span class="plain">);</span>
@ -697,11 +564,12 @@ that the extension isn't the one he thinks it is.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::check_ends_here</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Inclusion::check_ends_here</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</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">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">problem_count</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">problem_count</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">;</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_extension</span><span class="plain">(1, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</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">PM_ExtMisidentifiedEnds</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
@ -757,7 +625,7 @@ we might in future.
<p class="endnote">The function Extensions::Inclusion::handle_extension_ends appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="8-ef.html">Back to 'Extension Files'</a></li><li><a href="8-ei.html">Continue with 'Extension Identifiers'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="8-ef.html">Back to 'Extension Files'</a></li><li><i>(This section ends Chapter 8: Extensions.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -60,7 +60,7 @@ generalisations which apply to it.
<p class="inwebparagraph"></p>
<p class="endnote">The structure generalisation is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure generalisation is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>For reasons to do with timing, each object needs to keep track of which
generalisations have and have not yet applied to it. In practice, this is
@ -79,7 +79,7 @@ applied from K's list.
<p class="inwebparagraph"></p>
<p class="endnote">The structure application is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="endnote">The structure application is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>These structures are combined in the following packet of data attached to
each inference subject:

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>8/ed2</title>
<title>8/ie</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">

View file

@ -2547,7 +2547,7 @@ suite: it would be annoying to verify this problem message otherwise.)
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, *</span><span class="identifier">Q</span><span class="plain">, *</span><span class="identifier">In</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">variant</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rng_seed_at_start_of_play</span><span class="plain"> == 0) </span><span class="identifier">variant</span><span class="plain"> = (</span><span class="identifier">time</span><span class="plain">(0))&amp;15;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Task::rng_seed</span><span class="plain">() == 0) </span><span class="identifier">variant</span><span class="plain"> = (</span><span class="identifier">time</span><span class="plain">(0))&amp;15;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">variant</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"the chalk"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"the cheese"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Dairy Products School"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"St Peter"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"St Paul"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Pearly Gates"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>

View file

@ -159,7 +159,7 @@ we don't bother to print details of the closing <code class="display"><span clas
<p class="inwebparagraph"></p>
<p class="endnote">The function Assertions::Traverse::traverse is used in 1/mr (<a href="1-mr.html#SP4_11">&#167;4.11</a>).</p>
<p class="endnote">The function Assertions::Traverse::traverse is used in 1/htc (<a href="1-htc.html#SP2_4">&#167;2.4</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Here's a tricky timing problem, or rather, here's the fix for it. Assemblies
are made when the kinds of objects are set, and they're made by inserting
@ -651,14 +651,14 @@ is the rubric, the second the credit line.
<pre class="displaydefn">
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</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="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">pos</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">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">near_start_of_extension</span><span class="plain">++) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="functiontext">Extensions::Files::set_rubric</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="functiontext">Extensions::Files::set_extra_credit</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">Extensions::set_rubric</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">Extensions::set_extra_credit</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">);</span>
<span class="identifier">near_start_of_extension</span><span class="plain"> = 0; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
@ -808,7 +808,7 @@ subject carried over from previous sentences.
<p class="inwebparagraph"></p>
<p class="endnote">The function Assertions::Traverse::new_discussion is used in <a href="#SP7">&#167;7</a>, 7/hdn (<a href="7-hdn.html#SP30">&#167;30</a>), 8/ie (<a href="8-ie.html#SP11">&#167;11</a>), 9/tbath (<a href="9-tbath.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Assertions::Traverse::new_discussion is used in <a href="#SP7">&#167;7</a>, 7/hdn (<a href="7-hdn.html#SP31">&#167;31</a>), 8/ie (<a href="8-ie.html#SP11">&#167;11</a>), 9/tbath (<a href="9-tbath.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Assertions::Traverse::change_discussion_topic is used in 9/tbath (<a href="9-tbath.html#SP5_1">&#167;5.1</a>).</p>

View file

@ -17,22 +17,22 @@
<ul class="sectionlist">
<li>
<p><a href="1-mr.html"><spon class="sectiontitle">Main Routine</span></a> -
<span class="purpose">As with all C programs, Inform begins execution in a |main| routine, reading command-line arguments to modify its behaviour.</span></p>
<span class="purpose">The top level of the Inform 7 compiler, reading command line arguments and preparing the way.</span></p>
</li>
<li>
<p><a href="1-cm.html"><spon class="sectiontitle">Core Module</span></a> -
<span class="purpose">Setting up the use of this module.</span></p>
</li>
<li>
<p><a href="1-kts.html"><spon class="sectiontitle">Kits</span></a> -
<span class="purpose">A kit is a combination of Inter code with an Inform 7 extension.</span></p>
</li>
<li>
<p><a href="1-pp.html"><spon class="sectiontitle">Progress Percentages</span></a> -
<span class="purpose">This tiny section, the Lichtenstein of Inform, prints percentage of completion estimates onto |stderr| so that the host application can intercept them and update its graphical progress bar.</span></p>
</li>
<li>
<p><a href="1-wel.html"><spon class="sectiontitle">Where Everything Lives</span></a> -
<p><a href="1-wtc.html"><spon class="sectiontitle">What To Compile</span></a> -
<span class="purpose">To receive an instruction to compile something from Inbuild, and then to sort out the many locations then used in the host filing system.</span></p>
</li>
<li>
<p><a href="1-htc.html"><spon class="sectiontitle">How To Compile</span></a> -
<span class="purpose">To configure the many locations used in the host filing system.</span></p>
</li>
</ul>
@ -193,22 +193,6 @@
<p><a href="8-ie.html"><spon class="sectiontitle">Including Extensions</span></a> -
<span class="purpose">To fulfill requests to include extensions, adding their material to the parse tree as needed, and removing INCLUDE nodes.</span></p>
</li>
<li>
<p><a href="8-ei.html"><spon class="sectiontitle">Extension Identifiers</span></a> -
<span class="purpose">To store, hash code and compare title/author pairs used to identify extensions which, though installed, are not necessarily used in the present source text.</span></p>
</li>
<li>
<p><a href="8-ec.html"><spon class="sectiontitle">Extension Census</span></a> -
<span class="purpose">To conduct a census of all the extensions installed (whether used on this run or not), and keep the documentation index for them up to date.</span></p>
</li>
<li>
<p><a href="8-ed.html"><spon class="sectiontitle">Extension Dictionary</span></a> -
<span class="purpose">To maintain a database of names and constructions in all extensions so far used by this installation of Inform, and spot potential namespace clashes.</span></p>
</li>
<li>
<p><a href="8-ed2.html"><spon class="sectiontitle">Extension Documentation</span></a> -
<span class="purpose">To generate HTML documentation for extensions.</span></p>
</li>
</ul>
</li>
<li>
@ -746,8 +730,8 @@
<p><span class="purpose">Mainly low-level utilities for compiling code.</span></p>
<ul class="sectionlist">
<li>
<p><a href="26-vm.html"><spon class="sectiontitle">Virtual Machines</span></a> -
<span class="purpose">I7 supports a variety of virtual machines as targets. Most source text should be independent of the target VM, but sometimes numbering is needed, and this is where any VM dependencies are decided.</span></p>
<p><a href="26-fc.html"><spon class="sectiontitle">Fundamental Constants</span></a> -
<span class="purpose">Inter constants for, say, extremal number values, which depend on the target we are compiling to, and are generally low-level in nature.</span></p>
</li>
<li>
<p><a href="26-i6i.html"><spon class="sectiontitle">Inform 6 Inclusions</span></a> -

View file

@ -11,7 +11,7 @@
<!--Weave of '2/bd' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">if</a></li><li><a href="index.html#2">Chapter 2: Bibliographic Data</a></li><li><b>Bibliographic Data</b></li></ul><p class="purpose">To manage the special variables providing bibliographic data on the work of IF being generated (title, author's name and so forth), and to write the Library Card in the index.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP17">&#167;17. Bibliographic text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
@ -138,7 +138,7 @@ it affects the grammar needed to understand the rest of the file &mdash;
<pre class="display">
<span class="identifier">natural_language</span><span class="plain"> *</span><span class="functiontext">PL::Bibliographic::scan_language</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="functiontext">PL::Bibliographic::scan_language</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
@ -256,7 +256,7 @@ person as the author of the main work.
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</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">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="functiontext">PL::Bibliographic::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">)) </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">result</span><span class="plain">;</span>
@ -529,7 +529,9 @@ simplified form of the iFiction record, without the XML overhead.
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Release number"</span><span class="plain">, </span><span class="identifier">story_release_number_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"1"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story creation year"</span><span class="plain">, </span><span class="identifier">story_creation_year_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"(This year)"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">NaturalLanguages::get_name</span><span class="plain">(</span><span class="identifier">language_of_play</span><span class="plain">));</span>
<span class="identifier">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">());</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">, </span><span class="string">"English"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">, </span><span class="string">"%X"</span><span class="plain">, </span><span class="identifier">L</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="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Language of play"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">lang</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"IFID number"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="functiontext">PL::Bibliographic::IFID::read_uuid</span><span class="plain">());</span>
@ -604,7 +606,7 @@ Contents listing, so:
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_XML_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">nlv</span><span class="plain">) &amp;&amp; (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">nlv</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">NonlocalVariables::treat_as_plain_text_word</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">);</span>
<span class="identifier">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</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="functiontext">PL::Bibliographic::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</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="plain">} </span><span class="reserved">else</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">t</span><span class="plain">);</span>
<span class="plain">}</span>
@ -616,6 +618,259 @@ Contents listing, so:
<p class="endnote">The function PL::Bibliographic::index_bibliographic_variable is used in <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. Bibliographic text. </b>"Bibliographic text" is text used in bibliographic data about the work
of IF compiled: for instance, in the iFiction record, or in the Library
Card section of the HTML index. Note that the exact output format depends
on global variables, which allow the bibliographic text writing code to
configure NI for its current purposes. On non-empty strings this routine
therefore splits into one of three independent methods.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</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="reserved">if</span><span class="plain"> (</span><span class="identifier">TEST_COMPILATION_MODE</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_XML_CMODE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Compile bibliographic text as XML respecting Treaty of Babel rules</span> <span class="cwebmacronumber">17.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEST_COMPILATION_MODE</span><span class="plain">(</span><span class="identifier">TRUNCATE_TEXT_CMODE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Compile bibliographic text as a truncated filename</span> <span class="cwebmacronumber">17.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEST_COMPILATION_MODE</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_I6_CMODE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Compile bibliographic text as an I6 string</span> <span class="cwebmacronumber">17.3</span>&gt;
&lt;<span class="cwebmacro">Compile bibliographic text as HTML</span> <span class="cwebmacronumber">17.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::compile_bibliographic_text is used in <a href="#SP9">&#167;9</a>, <a href="#SP16">&#167;16</a>, 2/ri (<a href="2-ri.html#SP12">&#167;12</a>, <a href="2-ri.html#SP13">&#167;13</a>).</p>
<p class="inwebparagraph"><a id="SP17_1"></a><b>&#167;17.1. </b>This looks like a standard routine for converting ISO Latin-1 to UTF-8
with XML escapes, but there are a few conventions on whitespace, too, in order
to comply with a strict reading of the Treaty of Babel. (This is intended
for fields in iFiction records.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile bibliographic text as XML respecting Treaty of Babel rules</span> <span class="cwebmacronumber">17.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0, </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)-1, </span><span class="identifier">snl</span><span class="plain">, </span><span class="identifier">wsc</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i2</span><span class="plain">] == </span><span class="character">'"'</span><span class="plain">)) { </span><span class="identifier">i</span><span class="plain">++; </span><span class="identifier">i2</span><span class="plain">--; } </span> <span class="comment">omit surrounding double-quotes</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">])) </span><span class="identifier">i</span><span class="plain">++; </span> <span class="comment">omit leading whitespace</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">i2</span><span class="plain">&gt;=0) &amp;&amp; (</span><span class="identifier">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i2</span><span class="plain">]))) </span><span class="identifier">i2</span><span class="plain">--; </span> <span class="comment">omit trailing whitespace</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">snl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">wsc</span><span class="plain"> = 0; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">i2</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0a'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">:</span>
<span class="identifier">snl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">wsc</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] == </span><span class="character">'\</span><span class="plain">x</span><span class="character">0a'</span><span class="plain">) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] == </span><span class="character">'\</span><span class="plain">x</span><span class="character">0d'</span><span class="plain">) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] == </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</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">wsc</span><span class="plain"> == 1) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] != </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">snl</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;br/&gt;"</span><span class="plain">);</span>
<span class="identifier">snl</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">wsc</span><span class="plain"> = 1; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+2] == </span><span class="character">']'</span><span class="plain">)) {</span>
<span class="identifier">i</span><span class="plain"> += 2;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">CompiledText::expand_unisub</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &gt;= 0) { </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
<span class="comment">and otherwise fall through to the default case</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">snl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">wsc</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'&amp;'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;amp;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'&lt;'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;lt;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'&gt;'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;gt;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP17_2"></a><b>&#167;17.2. </b>In the HTML version, we want to respect the forcing of newlines, and
also the <code class="display"><span class="extract">[']</span></code> escape to obtain a literal single quotation mark.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile bibliographic text as HTML</span> <span class="cwebmacronumber">17.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">whitespace_count</span><span class="plain">=0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'"'</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">++;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == 0)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0a'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">:</span>
<span class="identifier">whitespace_count</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">whitespace_count</span><span class="plain"> == 1) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">' '</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">:</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">) </span><span class="identifier">i</span><span class="plain">++;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="character">'&lt;'</span><span class="plain">);</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="character">'p'</span><span class="plain">);</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="character">'&gt;'</span><span class="plain">);</span>
<span class="identifier">whitespace_count</span><span class="plain"> = 1;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+2] == </span><span class="character">']'</span><span class="plain">)) {</span>
<span class="identifier">i</span><span class="plain"> += 2;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">CompiledText::expand_unisub</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &gt;= 0) { </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
<span class="comment">and otherwise fall through to the default case</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">whitespace_count</span><span class="plain"> = 0;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP17_3"></a><b>&#167;17.3. </b>In the Inform 6 string version, we suppress the forcing of newlines, but
otherwise it's much the same.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile bibliographic text as an I6 string</span> <span class="cwebmacronumber">17.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">whitespace_count</span><span class="plain">=0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'"'</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">++;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == 0)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0a'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">:</span>
<span class="identifier">whitespace_count</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">whitespace_count</span><span class="plain"> == 1) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">' '</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+2] == </span><span class="character">']'</span><span class="plain">)) {</span>
<span class="identifier">i</span><span class="plain"> += 2;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">} </span> <span class="comment">and otherwise fall through to the default case</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">whitespace_count</span><span class="plain"> = 0;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP17_4"></a><b>&#167;17.4. </b>This code is used to work out a good filename for something given a name
inside NI. For instance, if a project is called
</p>
<blockquote>
<p>"St. Bartholemew's Fair: \'Etude for a Push-Me/Pull-You Machine"</p>
</blockquote>
<p class="inwebparagraph">then what would be a good filename for its released story file?
</p>
<p class="inwebparagraph">In the filename version we must forcibly truncate the text to ensure
that it does not exceed a certain length, and must also make it filename-safe,
omitting characters used as folder separators on various platforms and
(for good measure) removing accents from accented letters, so that we can
arrive at a sequence of ASCII characters. Each run of whitespace is also
converted to a single space. If this would result in an empty text or only
a single space, we return the text "story" instead.
</p>
<p class="inwebparagraph">Our example (if not truncated) then emerges as:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">St- Bartholemew's Fair- Etude for a Push-Me-Pull-You Machine</span>
</pre>
<p class="inwebparagraph">Note that we do not write any filename extension (e.g., <code class="display"><span class="extract">.z5</span></code>) here.
</p>
<p class="inwebparagraph">We change possible filename separators or extension indicators to hyphens,
and remove accents from each possible ISO Latin-1 accented letter. This does
still mean that the OE and AE digraphs will simply be omitted, while the
German eszet will be barbarously shortened to a single "s", but life is
just too short to care overmuch about this.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile bibliographic text as a truncated filename</span> <span class="cwebmacronumber">17.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">STREAM_EXTENT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">), </span><span class="identifier">whitespace_count</span><span class="plain">=0, </span><span class="identifier">black_chars_written</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = 100;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="constant">IF_MODULE</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="constant">BIBLIOGRAPHIC_TEXT_TRUNCATION</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'"'</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">++;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_EXTENT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">) - </span><span class="identifier">pos</span><span class="plain"> &gt;= </span><span class="identifier">N</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] == 0)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0a'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">x</span><span class="character">0d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">:</span>
<span class="identifier">whitespace_count</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">whitespace_count</span><span class="plain"> == 1) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">' '</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'*'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1]) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1] != </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">'-'</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="identifier">charcode</span><span class="plain"> = </span><span class="identifier">Characters::make_filename_safe</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">);</span>
<span class="identifier">whitespace_count</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">charcode</span><span class="plain"> &lt; 128) {</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">); </span><span class="identifier">black_chars_written</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">break</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">black_chars_written</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"story"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-ifi.html">Back to 'Interactive Fiction ID'</a></li><li><a href="2-ri.html">Continue with 'Release Instructions'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -39,7 +39,7 @@ cases the UUID is empty.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uuid_read</span><span class="plain"> &gt;= 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">uuid_text</span><span class="plain">;</span>
<span class="identifier">uuid_text</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">uuid_read</span><span class="plain"> = 0;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">filename_of_uuid</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">Task::uuid_file</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">xf</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">uuid_text</span><span class="plain">; </span> <span class="comment">the UUID is the empty string if the file is missing</span>
<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">fgetc</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">)) != </span><span class="identifier">EOF</span><span class="plain">) </span> <span class="comment">the UUID file is plain text, not Unicode</span>

View file

@ -31,7 +31,7 @@ any "Release along with..." sentences, in fact.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">release_website</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">Release along with a website?</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">website_template_leafname</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"Standard"</span><span class="plain">; </span> <span class="comment">If so, the template name for it</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">release_interpreter</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">Release along with an interpreter?</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">If so, the template name for it</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">If so, the template name for it</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">release_booklet</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">Release along with introductory booklet?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">release_postcard</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">Release along with Zarf's IF card?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">release_cover</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">Release along with cover art?</span>
@ -272,7 +272,7 @@ optionally be marked "public" (they appear on any website about it) or
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXISTING_STORY_FILE_PAYLOAD</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NAMED_EXISTING_STORY_FILE_PAYLOAD</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VirtualMachines::is_16_bit</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">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">not usefully testable</span>
<span class="string">"existing story files can only be used with the Z-machine"</span><span class="plain">,</span>
<span class="string">"not with the Glulx setting."</span><span class="plain">);</span>
@ -283,11 +283,11 @@ optionally be marked "public" (they appear on any website about it) or
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">));</span>
<span class="identifier">filename_of_existing_story_file</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">Task::set_existing_storyfile</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Task::set_existing_storyfile</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">existing_story_file</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">AUXILIARY_FILE_PAYLOAD</span><span class="plain">: {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">DW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">release</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;, 1);</span>
@ -296,10 +296,10 @@ optionally be marked "public" (they appear on any website about it) or
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">DW</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">LW</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Inbuild::materials</span><span class="plain">(), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::Release::create_aux_file</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">,</span>
<span class="identifier">pathname_of_materials_release</span><span class="plain">,</span>
<span class="identifier">Task::release_path</span><span class="plain">(),</span>
<span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">DW</span><span class="plain">)),</span>
<span class="identifier">payload</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -309,10 +309,10 @@ optionally be marked "public" (they appear on any website about it) or
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">LW</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">LW</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Inbuild::materials</span><span class="plain">(), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::Release::create_aux_file</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">,</span>
<span class="identifier">pathname_of_materials_release</span><span class="plain">,</span>
<span class="identifier">Task::release_path</span><span class="plain">(),</span>
<span class="identifier">L</span><span class="string">"--"</span><span class="plain">,</span>
<span class="identifier">payload</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -324,11 +324,11 @@ optionally be marked "public" (they appear on any website about it) or
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">FW</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">LW</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Inbuild::materials</span><span class="plain">(), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">folder</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">folder</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">FW</span><span class="plain">));</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">folder</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">Task::release_path</span><span class="plain">(), </span><span class="identifier">folder</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">folder</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::Release::create_aux_file</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"--"</span><span class="plain">, </span><span class="identifier">payload</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -349,7 +349,8 @@ optionally be marked "public" (they appear on any website about it) or
<span class="reserved">case</span><span class="plain"> </span><span class="constant">THEMED_INTERPRETER_PAYLOAD</span><span class="plain">: {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">TW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">release</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;, 1);</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">TW</span><span class="plain">));</span>
<span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">TW</span><span class="plain">));</span>
<span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">interpreter_template_leafname</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">TW</span><span class="plain">));</span>
<span class="identifier">release_interpreter</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">release_website</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
@ -429,7 +430,7 @@ of writing the same thing.
&lt;<span class="cwebmacro">Check cover art image if any</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
<span class="constant">zbyte</span><span class="plain"> </span><span class="identifier">header</span><span class="plain">[</span><span class="constant">LENGTH_OF_STORY_FILE_HEADER</span><span class="plain">]; </span> <span class="comment">a sequence of bytes, not a C string</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) </span>&lt;<span class="cwebmacro">Read header of existing story file if present</span> <span class="cwebmacronumber">10.3</span>&gt;
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) </span>&lt;<span class="cwebmacro">Read header of existing story file if present</span> <span class="cwebmacronumber">10.3</span>&gt;
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span>&lt;<span class="cwebmacro">Finally, write out our three metadata files</span> <span class="cwebmacronumber">10.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
@ -455,7 +456,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
<span class="identifier">create_Materials</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span> <span class="comment">thus making the next condition irrelevant</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">release_website</span><span class="plain">) || (</span><span class="identifier">release_interpreter</span><span class="plain">) || (</span><span class="identifier">release_booklet</span><span class="plain">) || (</span><span class="identifier">release_postcard</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">release_cover</span><span class="plain">) || (</span><span class="identifier">release_source</span><span class="plain">) || (</span><span class="identifier">release_card</span><span class="plain">) || (</span><span class="identifier">release_solution</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">existing_story_file</span><span class="plain">) || (</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">blorb_figure</span><span class="plain">) &gt; 1)) {</span>
<span class="plain">(</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) || (</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">blorb_figure</span><span class="plain">) &gt; 1)) {</span>
<span class="identifier">create_Materials</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">create_Materials</span><span class="plain">) {</span>
@ -475,13 +476,13 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</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">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">Inbuild::materials</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::release_problem_path</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">),</span>
<span class="string">"In order to release the story file along with other "</span>
<span class="string">"resources, I tried to create a folder alongside this "</span>
<span class="string">"Inform project, but was unable to do so. The folder "</span>
<span class="string">"was to have been called"</span><span class="plain">,</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">Inbuild::materials</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -496,13 +497,13 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</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">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">Task::release_path</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::release_problem_path</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">),</span>
<span class="string">"In order to release the story file along with other "</span>
<span class="string">"resources, I tried to create a folder alongside this "</span>
<span class="string">"Inform project, but was unable to do so. The folder "</span>
<span class="string">"was to have been called"</span><span class="plain">,</span>
<span class="identifier">pathname_of_materials_release</span><span class="plain">);</span>
<span class="identifier">Task::release_path</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">auxiliary_file</span><span class="plain"> *</span><span class="identifier">af</span><span class="plain">;</span>
@ -528,13 +529,13 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_released_interpreter</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">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">Task::released_interpreter_path</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::release_problem_path</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">),</span>
<span class="string">"In order to release the story file along with an "</span>
<span class="string">"interpreter, I tried to create a folder alongside this "</span>
<span class="string">"Inform project, but was unable to do so. The folder "</span>
<span class="string">"was to have been called"</span><span class="plain">,</span>
<span class="identifier">pathname_of_released_interpreter</span><span class="plain">);</span>
<span class="identifier">Task::released_interpreter_path</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -557,11 +558,11 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">release_cover</span><span class="plain">) {</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">cover_filename_sentence</span><span class="plain">;</span>
<span class="identifier">cover_art_format</span><span class="plain"> = </span><span class="string">""</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">cover_filename</span><span class="plain"> = </span><span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">cover_filename</span><span class="plain"> = </span><span class="identifier">Task::large_cover_art_file</span><span class="plain">(</span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">COVER_FILE</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">cover_filename</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain"> );</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">COVER_FILE</span><span class="plain">) </span>&lt;<span class="cwebmacro">The cover seems to be a JPEG</span> <span class="cwebmacronumber">10.2.1</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">cover_filename</span><span class="plain"> = </span><span class="identifier">filename_of_large_cover_art_png</span><span class="plain">;</span>
<span class="identifier">cover_filename</span><span class="plain"> = </span><span class="identifier">Task::large_cover_art_file</span><span class="plain">(</span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">COVER_FILE</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">cover_filename</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain"> );</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">COVER_FILE</span><span class="plain">) </span>&lt;<span class="cwebmacro">The cover seems to be a PNG</span> <span class="cwebmacronumber">10.2.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">There seems to be no cover at all</span> <span class="cwebmacronumber">10.2.3</span>&gt;<span class="plain">;</span>
@ -667,16 +668,16 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_is_a_release_compile</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">Inbuild::currently_releasing</span><span class="plain">() == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a problem if this isn't a Release run</span> <span class="cwebmacronumber">10.3.1</span>&gt;<span class="character">;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">STORYF</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">filename_of_existing_story_file</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">STORYF</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">Task::existing_storyfile_file</span><span class="plain">(), </span><span class="string">"rb"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STORYF</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::unlocated_problem_on_file</span><span class="plain">(</span>
<span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">i.e., not testable by intest</span>
<span class="string">"The instruction 'Release along with an existing story file' "</span>
<span class="string">"means that I need to bind up a story file called '%1', in "</span>
<span class="string">"the .materials folder for this project. But it doesn't seem "</span>
<span class="string">"to be there."</span><span class="plain">, </span><span class="identifier">filename_of_existing_story_file</span><span class="plain">);</span>
<span class="string">"to be there."</span><span class="plain">, </span><span class="identifier">Task::existing_storyfile_file</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
@ -742,8 +743,9 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">xf_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = &amp;</span><span class="identifier">xf_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">filename_of_ifiction_record</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open metadata file"</span><span class="plain">, </span><span class="identifier">filename_of_ifiction_record</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Task::ifiction_record_file</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open metadata file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_XML_CMODE</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::Release::write_ifiction_record</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">header</span><span class="plain">, </span><span class="identifier">cover_picture_number</span><span class="plain">, </span><span class="identifier">cover_art_format</span><span class="plain">, </span><span class="identifier">height</span><span class="plain">, </span><span class="identifier">width</span><span class="plain">);</span>
@ -761,9 +763,10 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Task::blurb_file</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">xf_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = &amp;</span><span class="identifier">xf_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">filename_of_blurb</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open blurb file"</span><span class="plain">, </span><span class="identifier">filename_of_blurb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open blurb file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::Release::write_release_blurb</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">cover_picture_number</span><span class="plain">, </span><span class="identifier">cover_art_format</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">);</span>
</pre>
@ -778,9 +781,10 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Task::manifest_file</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">xf_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = &amp;</span><span class="identifier">xf_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">filename_of_manifest</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open manifest file"</span><span class="plain">, </span><span class="identifier">filename_of_manifest</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open manifest file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">PL::Figures::write_picture_manifest</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">, </span><span class="identifier">release_cover</span><span class="plain">, </span><span class="identifier">cover_art_format</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">);</span>
</pre>
@ -817,8 +821,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">story_format</span><span class="plain"> = </span><span class="string">"zcode"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">story_filename_extension</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ulx"</span><span class="plain">)) </span><span class="identifier">story_format</span><span class="plain"> = </span><span class="string">"glulx"</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">story_format</span><span class="plain"> = </span><span class="identifier">TargetVMs::get_iFiction_format</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">());</span>
&lt;<span class="cwebmacro">Write the identification tag of the iFiction record</span> <span class="cwebmacronumber">11.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the bibliographic tag of the iFiction record</span> <span class="cwebmacronumber">11.1.2</span>&gt;<span class="plain">;</span>
@ -828,9 +831,9 @@ art and see that its dimensions conform to Treaty of Babel requirements.
&lt;<span class="cwebmacro">Write the cover tag of the iFiction record</span> <span class="cwebmacronumber">11.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the releases tag of the iFiction record</span> <span class="cwebmacronumber">11.1.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the colophon tag of the iFiction record</span> <span class="cwebmacronumber">11.1.6</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;%s&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;%S&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Write the format-specific tag of the iFiction record</span> <span class="cwebmacronumber">11.1.7</span>&gt;<span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/%s&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/%S&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -845,7 +848,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;identification&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;ifid&gt;%S&lt;/ifid&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">PL::Bibliographic::IFID::read_uuid</span><span class="plain">());</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;ifid&gt;ZCODE-%d-%c%c%c%c%c%c"</span><span class="plain">,</span>
<span class="identifier">header</span><span class="plain">[2]*256+</span><span class="identifier">header</span><span class="plain">[3],</span>
<span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x12</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x13</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x14</span><span class="plain">],</span>
@ -854,7 +857,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"-%04x"</span><span class="plain">, </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x1c</span><span class="plain">]*256 + </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x1d</span><span class="plain">]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/ifid&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;format&gt;%s&lt;/format&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;format&gt;%S&lt;/format&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">story_format</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/identification&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
@ -892,7 +895,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/description&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;language&gt;"</span><span class="plain">);</span>
<span class="identifier">NaturalLanguages::write_language_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="identifier">Languages::write_ISO_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/language&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;group&gt;Inform&lt;/group&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">episode_number</span><span class="plain"> &gt;= 0) {</span>
@ -918,7 +921,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;auxiliary&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;leafname&gt;"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">Inbuild::materials</span><span class="plain">());</span>
<span class="identifier">HTMLFiles::write_xml_safe_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/leafname&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
@ -973,7 +976,7 @@ in February 2014.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;releases&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;attached&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;release&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) </span>&lt;<span class="cwebmacro">Write release data for an existing story file</span> <span class="cwebmacronumber">11.1.5.1</span>&gt;
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) </span>&lt;<span class="cwebmacro">Write release data for an existing story file</span> <span class="cwebmacronumber">11.1.5.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Write release data for an Inform 7 project</span> <span class="cwebmacronumber">11.1.5.2</span>&gt;<span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/release&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/attached&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
@ -1079,7 +1082,7 @@ LISP.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;serial&gt;%c%c%c%c%c%c&lt;/serial&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x12</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x13</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x14</span><span class="plain">],</span>
<span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x15</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x16</span><span class="plain">], </span><span class="identifier">header</span><span class="plain">[0</span><span class="identifier">x17</span><span class="plain">]);</span>
@ -1136,7 +1139,7 @@ LISP.
<span class="plain">} </span><span class="reserved">else</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</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">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="functiontext">PL::Bibliographic::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
@ -1172,7 +1175,7 @@ LISP.
<span class="plain">} </span><span class="reserved">else</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</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">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="functiontext">PL::Bibliographic::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
@ -1252,7 +1255,7 @@ the Blorb-file's filename won't be too long for the file system.
<span class="functiontext">PL::Bibliographic::Release::write_var_to_text</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">story_title_VAR</span><span class="plain">);</span>
<span class="identifier">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"story"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">".%s"</span><span class="plain">, </span><span class="identifier">VirtualMachines::get_blorbed_extension</span><span class="plain">());</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">".%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_blorbed_extension</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">()));</span>
</pre>
<p class="inwebparagraph"></p>
@ -1294,8 +1297,8 @@ the Blorb-file's filename won't be too long for the file system.
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"status \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">filename_of_cblorb_report_model</span><span class="plain">,</span>
<span class="identifier">filename_of_cblorb_report</span><span class="plain">);</span>
<span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">CBLORB_REPORT_MODEL_IRES</span><span class="plain">),</span>
<span class="identifier">Task::cblorb_report_file</span><span class="plain">());</span>
</pre>
<p class="inwebparagraph"></p>
@ -1308,9 +1311,9 @@ the Blorb-file's filename won't be too long for the file system.
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"project folder \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">pathname_of_project</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"project folder \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Projects::path</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">create_Materials</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release to \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">pathname_of_materials_release</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release to \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Task::release_path</span><span class="plain">());</span>
</pre>
<p class="inwebparagraph"></p>
@ -1324,11 +1327,11 @@ the Blorb-file's filename won't be too long for the file system.
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"storyfile leafname \</span><span class="plain">"</span><span class="string">"</span><span class="plain">); </span><span class="identifier">STREAM_COPY</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_existing_story_file</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">())</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Task::existing_storyfile_file</span><span class="plain">());</span>
<span class="reserved">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_story_file</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"ifiction \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_ifiction_record</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Task::storyfile_file</span><span class="plain">());</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"ifiction \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> include\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Task::ifiction_record_file</span><span class="plain">());</span>
</pre>
<p class="inwebparagraph"></p>
@ -1350,17 +1353,17 @@ released along with the work.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">release_cover</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">large</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">cover_art_format</span><span class="plain">, </span><span class="string">"jpg"</span><span class="plain">) == 0)</span>
<span class="identifier">large</span><span class="plain"> = </span><span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain">;</span>
<span class="identifier">large</span><span class="plain"> = </span><span class="identifier">Task::large_cover_art_file</span><span class="plain">(</span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">large</span><span class="plain"> = </span><span class="identifier">filename_of_large_cover_art_png</span><span class="plain">;</span>
<span class="identifier">large</span><span class="plain"> = </span><span class="identifier">Task::large_cover_art_file</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">"cover \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">large</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"picture %d \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">cover_picture_number</span><span class="plain">, </span><span class="identifier">large</span><span class="plain">);</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">"cover \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_large_default_cover_art</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"picture %d \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, 1, </span><span class="identifier">filename_of_large_default_cover_art</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"cover \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">LARGE_DEFAULT_COVER_ART_IRES</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"picture %d \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, 1, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">LARGE_DEFAULT_COVER_ART_IRES</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">release_website</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_large_default_cover_art</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_small_default_cover_art</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">LARGE_DEFAULT_COVER_ART_IRES</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">SMALL_DEFAULT_COVER_ART_IRES</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
@ -1464,7 +1467,7 @@ own credits.
<span class="reserved">auxiliary_file</span><span class="plain"> *</span><span class="identifier">af</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">af</span><span class="plain">, </span><span class="reserved">auxiliary_file</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">Pathnames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;folder_to_release_to</span><span class="plain">, </span><span class="identifier">pathname_of_materials_release</span><span class="plain">);</span>
<span class="identifier">Pathnames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;folder_to_release_to</span><span class="plain">, </span><span class="identifier">Task::release_path</span><span class="plain">());</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;brief_description</span><span class="plain">) &gt; 0)?(</span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;brief_description</span><span class="plain">):</span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">,</span>
@ -1472,10 +1475,10 @@ own credits.
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">release_booklet</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">Introduction to IF\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">--\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_intro_booklet</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">Introduction to IF\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">--\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">INTRO_BOOKLET_IRES</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">release_postcard</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">IF Postcard\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">--\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">filename_of_intro_postcard</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">IF Postcard\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">--\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Inbuild::file_from_installation</span><span class="plain">(</span><span class="identifier">INTRO_POSTCARD_IRES</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"placeholder [OTHERCREDITS] = \</span><span class="plain">"</span><span class="string">The postcard was written by Andrew Plotkin "</span>
<span class="string">"and designed by Lea Albaugh.\</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>
@ -1502,29 +1505,29 @@ file online.
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".js\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Tell Inblorb where to find the website templates</span> <span class="cwebmacronumber">14.2.8.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">interpreter_template_leafname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">VirtualMachines::get_default_interpreter</span><span class="plain">();</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">VirtualMachines::get_blorbed_extension</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">interpreter_template_leafname</span><span class="plain">) == 0)</span>
<span class="identifier">interpreter_template_leafname</span><span class="plain"> = </span><span class="identifier">TargetVMs::get_default_interpreter</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">());</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">TargetVMs::get_blorbed_extension</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">());</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"placeholder [INTERPRETERSCRIPTS] = \</span><span class="plain">"</span><span class="string"> "</span><span class="plain">);</span>
<span class="reserved">auxiliary_file</span><span class="plain"> *</span><span class="identifier">af</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">af</span><span class="plain">, </span><span class="reserved">auxiliary_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;from_payload</span><span class="plain"> == </span><span class="constant">JAVASCRIPT_PAYLOAD</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">Inbuild::materials</span><span class="plain">());</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;script src='%S'&gt;&lt;/script&gt;"</span><span class="plain">, </span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">af</span><span class="plain">, </span><span class="reserved">auxiliary_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;from_payload</span><span class="plain"> == </span><span class="constant">CSS_PAYLOAD</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="identifier">MATERIALS_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">Filenames::to_text_relative</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">af</span><span class="plain">-</span><span class="element">&gt;name_of_original_file</span><span class="plain">, </span><span class="identifier">Inbuild::materials</span><span class="plain">());</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;link rel='stylesheet' href='%S' type='text/css' media='all'&gt;&lt;/link&gt;"</span><span class="plain">, </span><span class="identifier">rel</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"interpreter \</span><span class="plain">"</span><span class="string">%w\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">%c\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">interpreter_template_leafname</span><span class="plain">, </span><span class="identifier">ext</span><span class="plain">[0]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"interpreter \</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">%c\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">interpreter_template_leafname</span><span class="plain">, </span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">ext</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"base64 \</span><span class="plain">"</span><span class="string">%f\</span><span class="plain">"</span><span class="string"> to \</span><span class="plain">"</span><span class="string">%p%c"</span><span class="plain">,</span>
<span class="identifier">filename_of_story_file</span><span class="plain">, </span><span class="identifier">pathname_of_released_interpreter</span><span class="plain">, </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">);</span>
<span class="identifier">Task::storyfile_file</span><span class="plain">(), </span><span class="identifier">Task::released_interpreter_path</span><span class="plain">(), </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">);</span>
<span class="identifier">STREAM_COPY</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".js\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
@ -1560,8 +1563,10 @@ with the earliest quoted searched first.
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="identifier">NO_FS_AREAS</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"template path \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">pathname_of_website_templates</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">]);</span>
<span class="identifier">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Inbuild::nest_list</span><span class="plain">();</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">inbuild_nest</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"template path \</span><span class="plain">"</span><span class="string">%p\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">TemplateManager::path_within_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -1235,9 +1235,10 @@ For instance, <code class="display"><span class="extract">28&amp;-125</span></co
<pre class="displaydefn">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Task::epsmap_file</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">EPS_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">EPS</span><span class="plain"> = &amp;</span><span class="identifier">EPS_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">, </span><span class="identifier">filename_of_epsfile</span><span class="plain">, </span><span class="identifier">ISO_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open EPS map file"</span><span class="plain">, </span><span class="identifier">filename_of_epsfile</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">ISO_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open EPS map file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_map</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">);</span>
</pre>

View file

@ -401,7 +401,7 @@ turn by turn.
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">this_is_a_release_compile</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">this_is_a_debug_compile</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">())) {</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ALLOWINSHOWME_HL</span><span class="plain">));</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Properties::iname</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>

View file

@ -314,7 +314,7 @@ to translate this to other languages.)
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">create</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain"> = </span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;no_ends</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain"> = 31;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VirtualMachines::is_16_bit</span><span class="plain">()) </span><span class="identifier">max</span><span class="plain"> = 15;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::is_16_bit</span><span class="plain">(</span><span class="identifier">Task::vm</span><span class="plain">())) </span><span class="identifier">max</span><span class="plain"> = 15;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">end</span><span class="plain"> &gt;= </span><span class="identifier">max</span><span class="plain">) </span>&lt;<span class="cwebmacro">Issue a too-many-ends problem message</span> <span class="cwebmacronumber">14.1</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;end_names</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">] = </span><span class="identifier">EW</span><span class="plain">;</span>

View file

@ -1926,7 +1926,7 @@ empty.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Spatial::spatial_stage_IV</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)) {</span>

View file

@ -592,7 +592,7 @@ at run-time, so we can't know now how many we will need.
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">MAP_STORAGE_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="identifier">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">words_used</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing_story_file</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">()) {</span>
<span class="identifier">Emit::array_divider</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"minimal, as there are no rooms"</span><span class="plain">);</span>
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
@ -621,9 +621,6 @@ at run-time, so we can't know now how many we will need.
<span class="plain">}</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"map"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"map of rooms and doors"</span><span class="plain">,</span>
<span class="identifier">words_used</span><span class="plain">, 0, </span><span class="identifier">FALSE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -254,8 +254,8 @@ from sentences, and this can include I6 properties with no I7 analogue.
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_BASE_KINDS</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">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</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_in_play</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">language_of_play</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">language_of_play</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_in_play</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">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Issue problem message if the name contains a comma</span> <span class="cwebmacronumber">11.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Assert the printed plural name property for kinds other than thing or kinds of room</span> <span class="cwebmacronumber">11.1.3</span>&gt;<span class="plain">;</span>
@ -273,7 +273,7 @@ from sentences, and this can include I6 properties with no I7 analogue.
<span class="identifier">this_is_named_for_something_with_a_printed_name</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Issue problem message if the name contains a comma</span> <span class="cwebmacronumber">11.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_has_a_printed_name</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assert the printed name property</span> <span class="cwebmacronumber">11.1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">language_of_play</span><span class="plain"> != </span><span class="identifier">English_language</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()) != </span><span class="identifier">English_language</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Assert male, female, neuter adjectives from grammatical gender</span> <span class="cwebmacronumber">11.1.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -335,7 +335,7 @@ a comma, and that's caught here:
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Instances::get_name_in_play</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="identifier">Wordings::empty</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">k</span><span class="plain"> = </span><span class="identifier">Instances::to_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</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">language_of_play</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</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">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">begins_with_lower_case</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>

View file

@ -413,7 +413,7 @@ we assume he is freestanding in the earliest defined room.
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">start_room</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="plain">&amp;&amp; (</span><span class="identifier">Instances::get_creating_file</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">primary_source_file</span><span class="plain">))</span>
<span class="plain">&amp;&amp; (</span><span class="identifier">Projects::draws_from_source_file</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">(), </span><span class="identifier">Instances::get_creating_file</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">))))</span>
<span class="identifier">start_room</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">start_room</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
@ -431,7 +431,7 @@ we assume he is freestanding in the earliest defined room.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">start_room</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">existing_story_file</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">start_room</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Task::wraps_existing_storyfile</span><span class="plain">() == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::unlocated_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NoStartRoom</span><span class="plain">),</span>
<span class="string">"There doesn't seem to be any location in this story, so there's "</span>
<span class="string">"nowhere for the player to begin. This may be because I have "</span>

View file

@ -1594,8 +1594,6 @@ infrastructure, and we access it with a single call.
<span class="identifier">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">ad_iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">record_count</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">ad_iname</span><span class="plain">);</span>
<span class="identifier">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"action"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 12, 0, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">DB_Action_Details_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">DB_ACTION_DETAILS_HL</span><span class="plain">);</span>
<span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Routines::begin</span><span class="plain">(</span><span class="identifier">DB_Action_Details_iname</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">act_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"act"</span><span class="plain">);</span>
@ -1783,13 +1781,13 @@ infrastructure, and we access it with a single call.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass</span><span class="plain">,</span>
<span class="identifier">extension_file</span><span class="plain"> **</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">heading</span><span class="plain"> **</span><span class="identifier">current_area</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">new_par</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bold</span><span class="plain">,</span>
<span class="identifier">inform_extension</span><span class="plain"> **</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">heading</span><span class="plain"> **</span><span class="identifier">current_area</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">new_par</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bold</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">on_details_page</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">;</span>
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">definition_area</span><span class="plain"> = </span><span class="identifier">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">new_par</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">pass</span><span class="plain"> == 1) {</span>
<span class="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
<span class="identifier">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">definition_area</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">ext</span><span class="plain"> != </span><span class="identifier">this_extension</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">this_extension</span><span class="plain">;</span>
@ -1800,20 +1798,20 @@ infrastructure, and we access it with a single call.
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</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">ext</span><span class="plain"> != </span><span class="identifier">standard_rules_extension</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">Extensions::is_standard</span><span class="plain">(*</span><span class="identifier">ext</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">f</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="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">"&lt;b&gt;Actions defined by the extension "</span><span class="plain">);</span>
<span class="identifier">Extensions::Files::write_name_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Extensions::write_name_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by "</span><span class="plain">);</span>
<span class="identifier">Extensions::Files::write_author_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Extensions::write_author_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</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">definition_area</span><span class="plain"> != *</span><span class="identifier">current_area</span><span class="plain">) &amp;&amp; (*</span><span class="identifier">ext</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">definition_area</span><span class="plain"> != *</span><span class="identifier">current_area</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</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">Sentences::Headings::get_text</span><span class="plain">(</span><span class="identifier">definition_area</span><span class="plain">);</span>

View file

@ -291,7 +291,7 @@ we divide these headwords into five "natures":
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">par_count</span><span class="plain"> = 0;</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">current_area</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="functiontext">PL::Actions::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, 1, &amp;</span><span class="identifier">ext</span><span class="plain">, &amp;</span><span class="identifier">current_area</span><span class="plain">, </span><span class="identifier">f</span><span class="plain">, &amp;</span><span class="identifier">new_par</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
@ -305,7 +305,7 @@ we divide these headwords into five "natures":
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">current_area</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="identifier">Index::open_file</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"A.html"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"&lt;Actions"</span><span class="plain">,</span>
<span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Detail view"</span><span class="plain">);</span>
@ -339,12 +339,12 @@ we divide these headwords into five "natures":
<span class="functiontext">PL::Parsing::Verbs::index_tokens</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Index::index_for_extension</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Index::index_for_extension</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">acn</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">acn</span><span class="plain">, </span><span class="reserved">action_name</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">acn</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) == </span><span class="identifier">ef</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="identifier">Extensions::Documentation::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">ef</span><span class="plain">, </span><span class="string">"Actions"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"action"</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">acn</span><span class="plain">-</span><span class="element">&gt;present_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="identifier">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">"Actions"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"action"</span><span class="plain">,</span>
<span class="identifier">acn</span><span class="plain">-</span><span class="element">&gt;present_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>
<span class="plain">}</span>

View file

@ -130,12 +130,12 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::Named::index_for_extension</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::Named::index_for_extension</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="reserved">named_action_pattern</span><span class="plain"> *</span><span class="identifier">nap</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">nap</span><span class="plain">, </span><span class="reserved">named_action_pattern</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">nap</span><span class="plain">-</span><span class="element">&gt;text_of_declaration</span><span class="plain">)) == </span><span class="identifier">ef</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="identifier">Extensions::Documentation::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">ef</span><span class="plain">, </span><span class="string">"Kinds of action"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kind of action"</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">nap</span><span class="plain">-</span><span class="element">&gt;text_of_declaration</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="identifier">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 of action"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kind of action"</span><span class="plain">,</span>
<span class="identifier">nap</span><span class="plain">-</span><span class="element">&gt;text_of_declaration</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>
<span class="plain">}</span>

Some files were not shown because too many files have changed in this diff Show more