1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Further work redrafting inbuild module

This commit is contained in:
Graham Nelson 2020-03-31 00:17:21 +01:00
parent 4c05cacf9b
commit b044dc53dd
63 changed files with 1432 additions and 1246 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6Q31 'Krypton' (30 March 2020)
v10.1.0-alpha.1+6Q32 'Krypton' (31 March 2020)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 30 March 2020
Build Number: 6Q31
Build Date: 31 March 2020
Build Number: 6Q32

View file

@ -59,7 +59,7 @@
<!--Weave of '1/ic' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Inbuild Control</b></li></ul><p class="purpose">The top-level controller through which client tools use this module.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Phases</a></li><li><a href="#SP3">&#167;3. Startup phase</a></li><li><a href="#SP4">&#167;4. Configuration phase</a></li><li><a href="#SP9">&#167;9. The Pretinkering, Tinkering, Nested and Projected phases</a></li><li><a href="#SP11">&#167;11. The Going Operational and Operational phases</a></li><li><a href="#SP12">&#167;12. The nest list</a></li><li><a href="#SP17">&#167;17. The shared project</a></li><li><a href="#SP22">&#167;22. Kit requests</a></li><li><a href="#SP23">&#167;23. Access to unmanaged Inform resources</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Phases</a></li><li><a href="#SP3">&#167;3. Startup phase</a></li><li><a href="#SP4">&#167;4. Configuration phase</a></li><li><a href="#SP9">&#167;9. The Pretinkering, Tinkering, Nested and Projected phases</a></li><li><a href="#SP11">&#167;11. The Graph Construction and Operational phases</a></li><li><a href="#SP12">&#167;12. The nest list</a></li><li><a href="#SP17">&#167;17. The shared project</a></li><li><a href="#SP22">&#167;22. Kit requests</a></li><li><a href="#SP23">&#167;23. Access to unmanaged Inform resources</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Phases. </b>The <code class="display"><span class="extract">inbuild</span></code> module provides services to whichever program is using it:
recall that the module is included both in <code class="display"><span class="extract">inform7</span></code> and in <code class="display"><span class="extract">inbuild</span></code> (the
@ -84,7 +84,7 @@ at which time the client can freely use its facilities.
<span class="definitionkeyword">enum</span> <span class="constant">NESTED_INBUILD_PHASE</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROJECTED_INBUILD_PHASE</span>
<span class="definitionkeyword">enum</span> <span class="constant">TARGETED_INBUILD_PHASE</span>
<span class="definitionkeyword">enum</span> <span class="constant">GOING_OPERATIONAL_INBUILD_PHASE</span>
<span class="definitionkeyword">enum</span> <span class="constant">GRAPH_CONSTRUCTION_INBUILD_PHASE</span>
<span class="definitionkeyword">enum</span> <span class="constant">OPERATIONAL_INBUILD_PHASE</span>
</pre>
@ -595,7 +595,7 @@ we would attempt to detect the language of syntax if we could.
<p class="endnote">The function Inbuild::set_current_vm is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. The Going Operational and Operational phases. </b><code class="display"><span class="extract">inbuild</span></code> is now in the Targeted phase, then, meaning that the client has
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. The Graph Construction and Operational phases. </b><code class="display"><span class="extract">inbuild</span></code> is now in the Targeted phase, then, meaning that the client has
called <code class="display"><span class="extract">Inbuild::optioneering_complete</span></code> and has been making further
preparations of its own. (For example, it could attach further kit
dependencies to the shared project.) The client has one further duty to
@ -603,22 +603,22 @@ perform: to call <code class="display"><span class="extract">Inbuild::go_operati
for use.
</p>
<p class="inwebparagraph">The brief "going operational" phase is used, for example, to build out
dependency graphs. We do that copy by copy. The shared project, if there is
one, goes first; then everything else known to us.
<p class="inwebparagraph">The brief "graph construction" phase is used to build out dependency graphs.
We do that copy by copy. The shared project, if there is one, goes first;
then everything else known to us.
</p>
<pre class="display">
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="functiontext">Inbuild::go_operational</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">TARGETED_INBUILD_PHASE</span><span class="plain">)</span>
<span class="identifier">inbuild_phase</span><span class="plain"> = </span><span class="constant">GOING_OPERATIONAL_INBUILD_PHASE</span><span class="plain">;</span>
<span class="identifier">inbuild_phase</span><span class="plain"> = </span><span class="constant">GRAPH_CONSTRUCTION_INBUILD_PHASE</span><span class="plain">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inbuild::project</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="functiontext">Copies::go_operational</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;as_copy</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="functiontext">Copies::construct_graph</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</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="identifier">C</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">))</span>
<span class="functiontext">Copies::go_operational</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Copies::construct_graph</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">inbuild_phase</span><span class="plain"> = </span><span class="constant">OPERATIONAL_INBUILD_PHASE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain">) </span><span class="functiontext">Extensions::Census::handle_census_mode</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inbuild::project</span><span class="plain">();</span>
@ -756,11 +756,11 @@ are given precedence over those in the external folder, and so on.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">&#167;9.2</a>, 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>, <a href="5-kts.html#SP2">&#167;2</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP1">&#167;1</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">&#167;9.2</a>, 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>, <a href="5-kts.html#SP2">&#167;2</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inbuild::internal is used in <a href="#SP23">&#167;23</a>, 5/ls (<a href="5-ls.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Inbuild::external is used in 5/ps (<a href="5-ps.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Inbuild::external is used in 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Inbuild::materials appears nowhere else.</p>
@ -784,7 +784,7 @@ the external nest is used.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::transient is used in 5/ed (<a href="5-ed.html#SP11">&#167;11</a>), 5/ed2 (<a href="5-ed2.html#SP3">&#167;3</a>), 5/ec (<a href="5-ec.html#SP15">&#167;15</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Inbuild::transient is used in 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>), 7/ed (<a href="7-ed.html#SP11">&#167;11</a>), 7/ed2 (<a href="7-ed2.html#SP3">&#167;3</a>), 7/ec (<a href="7-ec.html#SP15">&#167;15</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. The shared project. </b>In any single run, each of the Inform tools concerns itself with a single
Inform 7 program. This can be presented to it either in a project bundle
@ -957,7 +957,7 @@ depending on who's asking.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::project is used in <a href="#SP11">&#167;11</a>, 3/is (<a href="3-is.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Inbuild::project is used in <a href="#SP11">&#167;11</a>, 3/is (<a href="3-is.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP3_2">&#167;3.2</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>The materials folder sits alongside the project folder and has the same name,
but ending <code class="display"><span class="extract">.materials</span></code> instead of <code class="display"><span class="extract">.inform</span></code>.
@ -1088,7 +1088,7 @@ but they're just plain old files, and are not managed by Inbuild as "copies".
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::file_from_installation is used in 5/ed2 (<a href="5-ed2.html#SP3_2">&#167;3.2</a>), 5/ec (<a href="5-ec.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function Inbuild::file_from_installation is used in 7/ed2 (<a href="7-ed2.html#SP3_2">&#167;3.2</a>), 7/ec (<a href="7-ec.html#SP15">&#167;15</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-im.html">Back to 'Inbuild Module'</a></li><li><i>(This section ends Chapter 1: Setting Up.)</i></li></ul><hr class="tocbar">

View file

@ -105,7 +105,7 @@ fields are blank.
<p class="inwebparagraph"></p>
<p class="endnote">The structure copy_error is accessed in 2/nst, 3/is, 5/kts, 5/ed2, 5/ec, 5/ls, 6/inc and here.</p>
<p class="endnote">The structure copy_error is accessed in 2/nst, 3/is, 5/kts, 5/ls, 6/inc, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>And now some creators.
</p>
@ -157,13 +157,13 @@ fields are blank.
<p class="inwebparagraph"></p>
<p class="endnote">The function CopyErrors::new is used in 5/ps (<a href="5-ps.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function CopyErrors::new is used in 5/ps2 (<a href="5-ps2.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function CopyErrors::new_T is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>, <a href="5-es.html#SP1_1">&#167;1.1</a>, <a href="5-es.html#SP1_1_3">&#167;1.1.3</a>, <a href="5-es.html#SP1_1_3_2">&#167;1.1.3.2</a>), 6/hdn (<a href="6-hdn.html#SP23_2">&#167;23.2</a>), 6/inc (<a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function CopyErrors::new_T is used in 5/es (<a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 6/hdn (<a href="6-hdn.html#SP23_2">&#167;23.2</a>), 6/inc (<a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function CopyErrors::new_N is used in 5/es (<a href="5-es.html#SP1">&#167;1</a>), 6/st (<a href="6-st.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function CopyErrors::new_N is used in 5/es (<a href="5-es.html#SP2_3">&#167;2.3</a>), 6/st (<a href="6-st.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function CopyErrors::new_F is used in 5/es (<a href="5-es.html#SP1_1">&#167;1.1</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CopyErrors::new_F is used in 5/es (<a href="5-es.html#SP2_2">&#167;2.2</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CopyErrors::new_WT is used in 6/st (<a href="6-st.html#SP2">&#167;2</a>).</p>
@ -204,7 +204,7 @@ we also offer these functions to tack extra details on:
<p class="endnote">The function CopyErrors::supply_works is used in 6/hdn (<a href="6-hdn.html#SP24_1">&#167;24.1</a>).</p>
<p class="endnote">The function CopyErrors::supply_node is used in 5/ps (<a href="5-ps.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function CopyErrors::supply_node is used in 5/ps2 (<a href="5-ps2.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function CopyErrors::supply_nodes is used in 6/hdn (<a href="6-hdn.html#SP24_1">&#167;24.1</a>).</p>
@ -247,7 +247,7 @@ output.
<p class="inwebparagraph"></p>
<p class="endnote">The function CopyErrors::write is used in 2/cps (<a href="2-cps.html#SP5">&#167;5</a>), 5/ec (<a href="5-ec.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CopyErrors::write is used in 2/cps (<a href="2-cps.html#SP5">&#167;5</a>), 7/ec (<a href="7-ec.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write a lexer error</span> <span class="cwebmacronumber">5.1</span>&gt; =

View file

@ -91,7 +91,7 @@ stored here.
<p class="inwebparagraph"></p>
<p class="endnote">The structure inbuild_copy is accessed in 1/ic, 2/nst, 3/bg, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inbuild_copy is accessed in 1/ic, 2/nst, 3/bg, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps2, 6/hdn, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Copies are created by the managers for the respective genres, usually when
claiming. If you are a manager, do not call this...
@ -138,7 +138,7 @@ claiming. If you are a manager, do not call this...
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::new_in_file is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Copies::new_in_file is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Copies::new_in_path is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>).</p>
@ -155,7 +155,7 @@ additional data specific to your genre:
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::set_content is used in 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Copies::set_content is used in 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/es (<a href="5-es.html#SP2">&#167;2</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. List of errors. </b>When copies are found to be malformed, error messages are attached to them
for later reporting. These are stored in a list.
@ -181,9 +181,9 @@ for later reporting. These are stored in a list.
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::attach_error is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>, <a href="5-es.html#SP1_1">&#167;1.1</a>, <a href="5-es.html#SP1_1_3">&#167;1.1.3</a>, <a href="5-es.html#SP1_1_3_2">&#167;1.1.3.2</a>), 5/ps (<a href="5-ps.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>, <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Copies::attach_error is used in 5/es (<a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ps2 (<a href="5-ps2.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>, <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Copies::list_attached_errors is used in <a href="#SP9">&#167;9</a>, 5/ps (<a href="5-ps.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Copies::list_attached_errors is used in <a href="#SP9">&#167;9</a>, 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Writing. </b></p>
@ -223,20 +223,20 @@ for later reporting. These are stored in a list.
<p class="endnote">The function Copies::source_text_has_been_read is used in 6/inc (<a href="6-inc.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Copies::get_source_text is used in 1/ic (<a href="1-ic.html#SP9">&#167;9</a>), 4/em (<a href="4-em.html#SP8">&#167;8</a>), 5/ed2 (<a href="5-ed2.html#SP3_1">&#167;3.1</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Copies::get_source_text is used in 1/ic (<a href="1-ic.html#SP9">&#167;9</a>), 4/em (<a href="4-em.html#SP8">&#167;8</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>), 7/ed2 (<a href="7-ed2.html#SP3_1">&#167;3.1</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Going operational. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::construct_graph</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</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 Copies::go_operational is used in 1/ic (<a href="1-ic.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Copies::construct_graph is used in 1/ic (<a href="1-ic.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Miscellaneous Inbuild commands. </b>This function implements the command-line instruction to <code class="display"><span class="extract">-inspect</span></code>.
</p>
@ -367,7 +367,7 @@ its main task: building an Inform project.
<p class="endnote">The function Copies::copy_to is used in 3/bg (<a href="3-bg.html#SP9_1">&#167;9.1</a>).</p>
<p class="endnote">The function Copies::overwrite_error is used in 4/km (<a href="4-km.html#SP6">&#167;6</a>), 4/em (<a href="4-em.html#SP7">&#167;7</a>), 4/lm (<a href="4-lm.html#SP6">&#167;6</a>), 4/tm (<a href="4-tm.html#SP6">&#167;6</a>), 4/pm (<a href="4-pm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Copies::overwrite_error is used in 4/em (<a href="4-em.html#SP7">&#167;7</a>), 4/km (<a href="4-km.html#SP6">&#167;6</a>), 4/lm (<a href="4-lm.html#SP6">&#167;6</a>), 4/pm (<a href="4-pm.html#SP6">&#167;6</a>), 4/tm (<a href="4-tm.html#SP6">&#167;6</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-edt.html">Back to 'Editions'</a></li><li><a href="2-ce.html">Continue with 'Copy Errors'</a></li></ul><hr class="tocbar">

View file

@ -99,11 +99,11 @@ might work with all VMs, while version 8 required a 32-bit architecture.
<p class="inwebparagraph"></p>
<p class="endnote">The function Editions::new is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Editions::new is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/es (<a href="5-es.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function Editions::write is used in <a href="#SP3">&#167;3</a>, 2/cps (<a href="2-cps.html#SP6">&#167;6</a>).</p>
<p class="endnote">The structure inbuild_edition is accessed in 2/wrk, 2/cps, 2/rqr, 2/nst, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inbuild_edition is accessed in 2/wrk, 2/cps, 2/rqr, 2/nst, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 6/vmg, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>When a copy is to be duplicated into a nest <code class="display"><span class="extract">N</span></code>, we need to work out where
to put it. For example, version 2.1 of the extension Marbles by Steve Hogarth
@ -130,7 +130,7 @@ contributes only the un-filename-extended leafname <code class="display"><span c
<p class="inwebparagraph"></p>
<p class="endnote">The function Editions::write_canonical_leaf is used in 4/km (<a href="4-km.html#SP6">&#167;6</a>), 4/em (<a href="4-em.html#SP7">&#167;7</a>), 4/lm (<a href="4-lm.html#SP6">&#167;6</a>), 4/tm (<a href="4-tm.html#SP6">&#167;6</a>), 4/pm (<a href="4-pm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Editions::write_canonical_leaf is used in 4/em (<a href="4-em.html#SP7">&#167;7</a>), 4/km (<a href="4-km.html#SP6">&#167;6</a>), 4/lm (<a href="4-lm.html#SP6">&#167;6</a>), 4/pm (<a href="4-pm.html#SP6">&#167;6</a>), 4/tm (<a href="4-tm.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The <code class="display"><span class="extract">-inspect</span></code> command of Inbuild uses the following.
</p>

View file

@ -100,7 +100,7 @@ the instance <code class="display"><span class="extract">kit_genre</span></code>
<p class="inwebparagraph"></p>
<p class="endnote">The function Genres::new is used in 4/km (<a href="4-km.html#SP1">&#167;1</a>), 4/em (<a href="4-em.html#SP2">&#167;2</a>), 4/lm (<a href="4-lm.html#SP1">&#167;1</a>), 4/pbm (<a href="4-pbm.html#SP1">&#167;1</a>), 4/pfm (<a href="4-pfm.html#SP1">&#167;1</a>), 4/tm (<a href="4-tm.html#SP1">&#167;1</a>), 4/pm (<a href="4-pm.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Genres::new is used in 4/em (<a href="4-em.html#SP2">&#167;2</a>), 4/km (<a href="4-km.html#SP1">&#167;1</a>), 4/lm (<a href="4-lm.html#SP1">&#167;1</a>), 4/pm (<a href="4-pm.html#SP1">&#167;1</a>), 4/pbm (<a href="4-pbm.html#SP1">&#167;1</a>), 4/pfm (<a href="4-pfm.html#SP1">&#167;1</a>), 4/tm (<a href="4-tm.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Genres::name is used in 2/cps (<a href="2-cps.html#SP9">&#167;9</a>).</p>
@ -216,6 +216,10 @@ is scanned for metadata during claiming, only the opening line is looked at.)
text. It will never be called twice on the same copy.
</p>
<p class="inwebparagraph">Text should actually be read by feeding it into the lexer. Inbuild will take
of it from there.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">GENRE_READ_SOURCE_TEXT_FOR_MTID</span>
@ -228,7 +232,7 @@ text. It will never be called twice on the same copy.
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>At the Going Operational phase of Inbuild, each copy is offered the chance
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>At the Graph Construction phase of Inbuild, each copy is offered the chance
to finalise its internal representation. For example, this may be when its
build graph is constructed, because we can now know for sure that there are
no further unsuspected dependencies.
@ -238,17 +242,13 @@ no further unsuspected dependencies.
provides it) which has been claimed by Inbuild.
</p>
<p class="inwebparagraph">Text should actually be read by feeding it into the lexer. Inbuild will take
of it from there.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">GENRE_GO_OPERATIONAL_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">,</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain">,</span>
<span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">)</span>
</pre>

View file

@ -87,7 +87,7 @@ positions in the file system hierarchy which may or may not exist.
<p class="endnote">The function Nests::new is used in 1/ic (<a href="1-ic.html#SP13">&#167;13</a>).</p>
<p class="endnote">The structure inbuild_nest is accessed in 1/ic, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/tm, 4/pm, 5/ps and here.</p>
<p class="endnote">The structure inbuild_nest is accessed in 1/ic, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/tm, 5/ps2 and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Nests used by the Inform and Inbuild tools are tagged with the following
comstamts. (There used to be quite a good joke here, but refactoring of the
@ -120,7 +120,7 @@ see below for why. Lower-tag-numbered origins are better than later ones.
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::get_tag is used in <a href="#SP9">&#167;9</a>, 1/ic (<a href="1-ic.html#SP14">&#167;14</a>), 3/is2 (<a href="3-is2.html#SP1">&#167;1</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP1">&#167;1</a>, <a href="5-ec.html#SP3_1">&#167;3.1</a>, <a href="5-ec.html#SP3_2">&#167;3.2</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Nests::get_tag is used in <a href="#SP9">&#167;9</a>, 1/ic (<a href="1-ic.html#SP14">&#167;14</a>), 3/is2 (<a href="3-is2.html#SP1">&#167;1</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP1">&#167;1</a>, <a href="7-ec.html#SP3_1">&#167;3.1</a>, <a href="7-ec.html#SP3_2">&#167;3.2</a>).</p>
<p class="endnote">The function Nests::set_tag is used in 1/ic (<a href="1-ic.html#SP13">&#167;13</a>).</p>
@ -184,7 +184,7 @@ we create one of these for each hit:
<p class="inwebparagraph"></p>
<p class="endnote">The structure inbuild_search_result is accessed in 2/ce, 3/is, 5/kts, 5/ed2, 5/ec, 5/ls, 6/inc and here.</p>
<p class="endnote">The structure inbuild_search_result is accessed in 2/ce, 3/is, 5/kts, 5/ls, 6/inc, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>These can be created only as entries in a list:
</p>
@ -204,7 +204,7 @@ we create one of these for each hit:
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::add_search_result is used in 4/km (<a href="4-km.html#SP5">&#167;5</a>), 4/em (<a href="4-em.html#SP6">&#167;6</a>), 4/lm (<a href="4-lm.html#SP5">&#167;5</a>), 4/tm (<a href="4-tm.html#SP5">&#167;5</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Nests::add_search_result is used in 4/em (<a href="4-em.html#SP6">&#167;6</a>), 4/km (<a href="4-km.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP5">&#167;5</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>), 4/tm (<a href="4-tm.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>And here is our search engine, such as it is. For each nest, we ask each
genre's manager to look for copies of that genre:
@ -225,7 +225,7 @@ genre's manager to look for copies of that genre:
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::search_for is used in <a href="#SP8">&#167;8</a>, 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Nests::search_for is used in <a href="#SP8">&#167;8</a>, 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Oftentimes, we want only the single best result, and won't even look at the
others:

View file

@ -78,7 +78,7 @@ we can give a semantic version number range:
<p class="inwebparagraph"></p>
<p class="endnote">The structure inbuild_requirement is accessed in 2/wrk, 2/edt, 2/cps, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inbuild_requirement is accessed in 2/wrk, 2/edt, 2/cps, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps2, 6/hdn, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Here are some creators:
</p>
@ -109,9 +109,9 @@ we can give a semantic version number range:
<p class="endnote">The function Requirements::new is used in 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Requirements::anything_of_genre is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 5/ec (<a href="5-ec.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Requirements::anything_of_genre is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 7/ec (<a href="7-ec.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Requirements::anything is used in <a href="#SP3">&#167;3</a>.</p>
@ -314,7 +314,7 @@ a requirement, then so will all other copies of it.
<p class="inwebparagraph"></p>
<p class="endnote">The function Requirements::meets is used in 4/km (<a href="4-km.html#SP5">&#167;5</a>), 4/em (<a href="4-em.html#SP6">&#167;6</a>), 4/lm (<a href="4-lm.html#SP5">&#167;5</a>), 4/tm (<a href="4-tm.html#SP5">&#167;5</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>), 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/es (<a href="5-es.html#SP4">&#167;4</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Requirements::meets is used in 4/em (<a href="4-em.html#SP6">&#167;6</a>), 4/km (<a href="4-km.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP5">&#167;5</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>), 4/tm (<a href="4-tm.html#SP5">&#167;5</a>), 5/es (<a href="5-es.html#SP7">&#167;7</a>), 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 6/inc (<a href="6-inc.html#SP6">&#167;6</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-ce.html">Back to 'Copy Errors'</a></li><li><a href="2-nst.html">Continue with 'Nests'</a></li></ul><hr class="tocbar">

View file

@ -90,7 +90,7 @@ combination of the textual names and the hash code:
<p class="inwebparagraph"></p>
<p class="endnote">The structure inbuild_work is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/inc and here.</p>
<p class="endnote">The structure inbuild_work is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps2, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Each work structure is written only once, and its title and author name are
not subsequently altered.
@ -112,7 +112,7 @@ not subsequently altered.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::new is used in <a href="#SP10">&#167;10</a>, 2/rqr (<a href="2-rqr.html#SP2">&#167;2</a>), 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>), 5/ed (<a href="5-ed.html#SP10">&#167;10</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Works::new is used in <a href="#SP10">&#167;10</a>, 2/rqr (<a href="2-rqr.html#SP2">&#167;2</a>), 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 4/em (<a href="4-em.html#SP4">&#167;4</a>), 4/lm (<a href="4-lm.html#SP3">&#167;3</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/es (<a href="5-es.html#SP2_3">&#167;2.3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>), 7/ed (<a href="7-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::new_raw is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>).</p>
@ -203,7 +203,7 @@ begins at the start of the text, after a hyphen, or after a bracket. Thus
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::normalise_casing is used in <a href="#SP3">&#167;3</a>, 5/es (<a href="5-es.html#SP1_1_1">&#167;1.1.1</a>).</p>
<p class="endnote">The function Works::normalise_casing is used in <a href="#SP3">&#167;3</a>, 5/es (<a href="5-es.html#SP2_2_1">&#167;2.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Printing. </b>As noted above, the raw forms are used for output.
</p>
@ -227,7 +227,7 @@ begins at the start of the text, after a hyphen, or after a bracket. Thus
<p class="endnote">The function Works::write is used in 2/edt (<a href="2-edt.html#SP1">&#167;1</a>), 3/bg (<a href="3-bg.html#SP7">&#167;7</a>, <a href="3-bg.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::write_to_HTML_file is used in <a href="#SP6">&#167;6</a>, 5/ed (<a href="5-ed.html#SP19_2">&#167;19.2</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">&#167;3.2.1</a>).</p>
<p class="endnote">The function Works::write_to_HTML_file is used in <a href="#SP6">&#167;6</a>, 7/ed (<a href="7-ed.html#SP19_2">&#167;19.2</a>), 7/ed2 (<a href="7-ed2.html#SP3_2_1">&#167;3.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The following is only sensible for extensions, and is used when Inform
generates its Extensions index entries.
@ -248,7 +248,7 @@ generates its Extensions index entries.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::write_link_to_HTML_file is used in 5/ed (<a href="5-ed.html#SP20_1">&#167;20.1</a>).</p>
<p class="endnote">The function Works::write_link_to_HTML_file is used in 7/ed (<a href="7-ed.html#SP20_1">&#167;20.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The Inbuild module provides the <code class="display"><span class="extract">%X</span></code> escape sequence for printing names of
works. (The X used to stand for Extension.) <code class="display"><span class="extract">%&lt;X</span></code> ptovides an abbreviated form.
@ -307,7 +307,7 @@ order-preserving. To emphasise this we return true or false rather than a
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::match is used in <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>, 5/ed (<a href="5-ed.html#SP9">&#167;9</a>, <a href="5-ed.html#SP18">&#167;18</a>, <a href="5-ed.html#SP18_2">&#167;18.2</a>), 5/ec (<a href="5-ec.html#SP3_1">&#167;3.1</a>), 6/hdn (<a href="6-hdn.html#SP23">&#167;23</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>).</p>
<p class="endnote">The function Works::match is used in <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>, 6/hdn (<a href="6-hdn.html#SP23">&#167;23</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>), 7/ed (<a href="7-ed.html#SP9">&#167;9</a>, <a href="7-ed.html#SP18">&#167;18</a>, <a href="7-ed.html#SP18_2">&#167;18.2</a>), 7/ec (<a href="7-ec.html#SP3_1">&#167;3.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>These are quite a deal slower, but are trichotomous and can be used for
sorting.
@ -350,13 +350,13 @@ sorting.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::compare is used in 5/ed (<a href="5-ed.html#SP18">&#167;18</a>), 5/ec (<a href="5-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare is used in 7/ed (<a href="7-ed.html#SP18">&#167;18</a>), 7/ec (<a href="7-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_title is used in 5/ec (<a href="5-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_title is used in 7/ec (<a href="7-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_date is used in 5/ec (<a href="5-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_date is used in 7/ec (<a href="7-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_length is used in 5/ec (<a href="5-ec.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::compare_by_length is used in 7/ec (<a href="7-ec.html#SP8">&#167;8</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Because Basic Inform and the Standard Rules extensions are treated slightly
differently by the documentation, and so forth, it's convenient to provide a
@ -390,7 +390,7 @@ single function testing if a work refers to them.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::is_standard_rules is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, 4/em (<a href="4-em.html#SP4">&#167;4</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">&#167;3.2.1</a>).</p>
<p class="endnote">The function Works::is_standard_rules is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, 4/em (<a href="4-em.html#SP4">&#167;4</a>), 7/ed2 (<a href="7-ed2.html#SP3_2_1">&#167;3.2.1</a>).</p>
<p class="endnote">The function Works::is_basic_inform is used in <a href="#SP7">&#167;7</a>.</p>
@ -464,9 +464,9 @@ indeed, the typical number will be 0 or 1.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::add_to_database is used in <a href="#SP10">&#167;10</a>, 4/km (<a href="4-km.html#SP4">&#167;4</a>), 4/em (<a href="4-em.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP3">&#167;3</a>), 4/pfm (<a href="4-pfm.html#SP3">&#167;3</a>), 4/tm (<a href="4-tm.html#SP4">&#167;4</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>), 5/ed (<a href="5-ed.html#SP10">&#167;10</a>), 5/ec (<a href="5-ec.html#SP3_2">&#167;3.2</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Works::add_to_database is used in <a href="#SP10">&#167;10</a>, 4/em (<a href="4-em.html#SP5">&#167;5</a>), 4/km (<a href="4-km.html#SP4">&#167;4</a>), 4/lm (<a href="4-lm.html#SP4">&#167;4</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP3">&#167;3</a>), 4/pfm (<a href="4-pfm.html#SP3">&#167;3</a>), 4/tm (<a href="4-tm.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP2">&#167;2</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>), 7/ed (<a href="7-ed.html#SP10">&#167;10</a>), 7/ec (<a href="7-ec.html#SP3_2">&#167;3.2</a>).</p>
<p class="endnote">The structure inbuild_work_database_entry is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inbuild_work_database_entry is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps2, 6/hdn, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>This gives us reasonably rapid access to a shared date:
</p>
@ -586,23 +586,23 @@ indeed, the typical number will be 0 or 1.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::set_usage_date is used in 5/ed (<a href="5-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::set_usage_date is used in 7/ed (<a href="7-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::set_sort_date is used in 5/ed (<a href="5-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::set_sort_date is used in 7/ed (<a href="7-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::get_usage_date is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::get_usage_date is used in 7/ec (<a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::get_sort_date is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function Works::set_word_count is used in 5/ed (<a href="5-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::set_word_count is used in 7/ed (<a href="7-ed.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Works::get_sort_word_count is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function Works::forgot is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::forgot is used in 7/ec (<a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::never is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::never is used in 7/ec (<a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::get_word_count is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="endnote">The function Works::get_word_count is used in 7/ec (<a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>The purpose of the hash table is to enable us to reply quickly when asked
for one of the following usage counts:
@ -620,7 +620,7 @@ for one of the following usage counts:
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::no_times_used_in_context is used in 5/ed (<a href="5-ed.html#SP8">&#167;8</a>), 5/ec (<a href="5-ec.html#SP7">&#167;7</a>), 6/hdn (<a href="6-hdn.html#SP23">&#167;23</a>).</p>
<p class="endnote">The function Works::no_times_used_in_context is used in 6/hdn (<a href="6-hdn.html#SP23">&#167;23</a>), 7/ed (<a href="7-ed.html#SP8">&#167;8</a>), 7/ec (<a href="7-ec.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The work hash table makes quite interesting reading, so:
</p>
@ -646,7 +646,7 @@ for one of the following usage counts:
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::log_work_hash_table is used in 5/ec (<a href="5-ec.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Works::log_work_hash_table is used in 7/ec (<a href="7-ec.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Documentation links. </b>This is where HTML links to extension documentation are created; the URL for
each extension's page is generated from its <code class="display"><span class="extract">inbuild_work</span></code>.
@ -686,11 +686,11 @@ each extension's page is generated from its <code class="display"><span class="e
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::begin_extension_link is used in 5/ec (<a href="5-ec.html#SP6_7_4_1">&#167;6.7.4.1</a>).</p>
<p class="endnote">The function Works::begin_extension_link is used in 7/ec (<a href="7-ec.html#SP6_7_4_1">&#167;6.7.4.1</a>).</p>
<p class="endnote">The function Works::escape_apostrophes appears nowhere else.</p>
<p class="endnote">The function Works::end_extension_link is used in 5/ec (<a href="5-ec.html#SP6_7_4_1">&#167;6.7.4.1</a>).</p>
<p class="endnote">The function Works::end_extension_link is used in 7/ec (<a href="7-ec.html#SP6_7_4_1">&#167;6.7.4.1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-gnr.html">Back to 'Genres'</a></li><li><a href="2-edt.html">Continue with 'Editions'</a></li></ul><hr class="tocbar">

View file

@ -115,7 +115,7 @@ compiled, is a file vertex.
<p class="inwebparagraph"></p>
<p class="endnote">The structure build_vertex is accessed in 1/ic, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure build_vertex is accessed in 1/ic, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Creation. </b>First, the three colours of vertex.
</p>
@ -155,7 +155,7 @@ compiled, is a file vertex.
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">&#167;3</a>, 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">&#167;3</a>, 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
@ -208,9 +208,9 @@ at most one edge of each colour.
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::need_this_to_build is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Graphs::need_this_to_build is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Graphs::need_this_to_use is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>).</p>
<p class="endnote">The function Graphs::need_this_to_use is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The script attached to a vertex is a list of instructions for how to build
the resource it refers to. Some vertices have no instructions provided, so:

View file

@ -87,7 +87,7 @@ for the tools <code class="display"><span class="extract">inter</span></code>, <
<p class="inwebparagraph"></p>
<p class="endnote">The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 4/lm, 4/tm, 4/pm and here.</p>
<p class="endnote">The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 4/lm, 4/pm, 4/tm and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>If the <code class="display"><span class="extract">tangled</span></code> flag is set, we expect <code class="display"><span class="extract">inform7</span></code>, for example, to be at
<code class="display"><span class="extract">tools_path/inform7/Tangled/inform7</span></code>; if it is clear, we expect it only to

View file

@ -133,7 +133,7 @@ to access any of <code class="display"><span class="extract">inbuild</span></cod
<p class="inwebparagraph"></p>
<p class="endnote">The structure build_step is accessed in 2/cps, 3/bg, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 5/kts, 5/ps, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure build_step is accessed in 2/cps, 3/bg, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 5/kts, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We build scripts for a vertex by attaching one step at a time to it:
</p>
@ -158,7 +158,7 @@ to access any of <code class="display"><span class="extract">inbuild</span></cod
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Execution. </b>Note that this prints a log of shell commands generated to <code class="display"><span class="extract">stdout</span></code> when
we are running inside Inbuild at the command line, but not when we are running

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>4/km</title>
<title>3/is4</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/em' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Extension Manager</b></li></ul><p class="purpose">An Inform 7 extension.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Extension Manager</b></li></ul><p class="purpose">Claiming and creating copies of the extension genre: used for Inform 7 extensions.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP5">&#167;5. Claiming</a></li><li><a href="#SP6">&#167;6. Searching</a></li><li><a href="#SP7">&#167;7. Copying</a></li><li><a href="#SP8">&#167;8. Build graph</a></li><li><a href="#SP9">&#167;9. Source text</a></li></ul><hr class="tocbar">
@ -68,6 +68,13 @@ graphs are a single vertex with no build edges, but with use edges to any
further extensions which they Include.
</p>
<p class="inwebparagraph">It may seem surprising that we do not provide a <code class="display"><span class="extract">GENRE_CONSTRUCT_GRAPH_MTID</span></code>
method. This is for efficiency reasons: we don't want to read and parse the
source text of every extension we ever see, and that's what would be needed
to make the graphs of every such extension. Instead we build out the graph
later on, as needed, just for extensions of interest: see below.
</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
@ -106,7 +113,7 @@ further extensions which they Include.
<p class="inwebparagraph"></p>
<p class="endnote">The function ExtensionManager::path_within_nest is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, 5/ec (<a href="5-ec.html#SP1">&#167;1</a>, <a href="5-ec.html#SP6_7_4_3">&#167;6.7.4.3</a>).</p>
<p class="endnote">The function ExtensionManager::path_within_nest is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, 7/ec (<a href="7-ec.html#SP1">&#167;1</a>, <a href="7-ec.html#SP6_7_4_3">&#167;6.7.4.3</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Extension copies are annotated with a structure called an <code class="display"><span class="extract">inform_extension</span></code>,
which stores data about extensions used by the Inform compiler.
@ -148,7 +155,7 @@ which stores data about extensions used by the Inform compiler.
<p class="inwebparagraph"></p>
<p class="endnote">The function ExtensionManager::from_copy is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, 5/es (<a href="5-es.html#SP5">&#167;5</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP2">&#167;2</a>), 6/st (<a href="6-st.html#SP11">&#167;11</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function ExtensionManager::from_copy is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, 5/es (<a href="5-es.html#SP4">&#167;4</a>), 6/st (<a href="6-st.html#SP11">&#167;11</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function ExtensionManager::new_copy is used in <a href="#SP5">&#167;5</a>.</p>
@ -353,7 +360,7 @@ the current VM settings.
<p class="endnote">The function ExtensionManager::read_source_text_for is used in <a href="#SP2">&#167;2</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-km.html">Back to 'Kit Manager'</a></li><li><a href="4-lm.html">Continue with 'Language Manager'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Genre Management.)</i></li><li><a href="4-km.html">Continue with 'Kit Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>3/is4</title>
<title>4/em</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/km' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Kit Manager</b></li></ul><p class="purpose">A kit is a combination of Inter code with an Inform 7 extension.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Kit Manager</b></li></ul><p class="purpose">Claiming and creating copies of the kit genre: used for kits of precompiled Inter code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li><li><a href="#SP7">&#167;7. Build graph</a></li></ul><hr class="tocbar">
@ -79,7 +79,7 @@ the metadata file.
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_CLAIM_AS_COPY_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::claim_as_copy</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_SEARCH_NEST_FOR_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::search_nest_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_COPY_TO_NEST_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::copy_to_nest</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::go_operational</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::construct_graph</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_BUILDING_SOON_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::building_soon</span><span class="plain">);</span>
<span class="plain">}</span>
@ -284,7 +284,7 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::construct_graph</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Kits::construct_graph</span><span class="plain">(</span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
@ -293,10 +293,10 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<p class="endnote">The function KitManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function KitManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function KitManager::construct_graph is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Managing Genres of Work.)</i></li><li><a href="4-em.html">Continue with 'Extension Manager'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-em.html">Back to 'Extension Manager'</a></li><li><a href="4-lm.html">Continue with 'Language Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>4/em</title>
<title>4/km</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/lm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Language Manager</b></li></ul><p class="purpose">A language is a combination of Inter code with an Inform 7 extension.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Language Manager</b></li></ul><p class="purpose">Claiming and creating copies of the language genre: used for bundles of natural language metadata in the Inform 7 compiler.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li></ul><hr class="tocbar">
@ -278,7 +278,7 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<p class="endnote">The function LanguageManager::copy_to_nest is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-em.html">Back to 'Extension Manager'</a></li><li><a href="4-pbm.html">Continue with 'Project Bundle Manager'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-km.html">Back to 'Kit Manager'</a></li><li><a href="4-pm.html">Continue with 'Pipeline Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>4/lm</title>
<title>4/pm</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/pbm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Project Bundle Manager</b></li></ul><p class="purpose">A project bundle is a folder holding an Inform 7 work. The app creates these.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Project Bundle Manager</b></li></ul><p class="purpose">Claiming and creating copies of the projectbundle genre: used for Inform 7 projects as created by the GUI apps.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP7">&#167;7. Source text</a></li></ul><hr class="tocbar">
@ -84,7 +84,7 @@ However it is stored in the file system, a project is a project.
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_CLAIM_AS_COPY_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::claim_as_copy</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_SEARCH_NEST_FOR_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::search_nest_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_COPY_TO_NEST_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::copy_to_nest</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::go_operational</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::construct_graph</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_READ_SOURCE_TEXT_FOR_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::read_source_text_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_bundle_genre</span><span class="plain">, </span><span class="constant">GENRE_BUILDING_SOON_MTID</span><span class="plain">, </span><span class="functiontext">ProjectBundleManager::building_soon</span><span class="plain">);</span>
<span class="plain">}</span>
@ -204,7 +204,7 @@ projects lived there.
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectBundleManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectBundleManager::construct_graph</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Projects::construct_graph</span><span class="plain">(</span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
@ -213,7 +213,7 @@ projects lived there.
<p class="endnote">The function ProjectBundleManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectBundleManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectBundleManager::construct_graph is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Source text. </b></p>
@ -229,7 +229,7 @@ projects lived there.
<p class="endnote">The function ProjectBundleManager::read_source_text_for is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-lm.html">Back to 'Language Manager'</a></li><li><a href="4-pfm.html">Continue with 'Project File Manager'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-pm.html">Back to 'Pipeline Manager'</a></li><li><a href="4-pfm.html">Continue with 'Project File Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/pfm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Project File Manager</b></li></ul><p class="purpose">A project file is a plain text file of Inform 7 source text.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Project File Manager</b></li></ul><p class="purpose">Claiming and creating copies of the projectfile genre: used for Inform 7 source texts stored as stand-alone plain text files, outside the GUI apps.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP7">&#167;7. Source text</a></li></ul><hr class="tocbar">
@ -82,7 +82,7 @@ However it is stored in the file system, a project is a project.
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_CLAIM_AS_COPY_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::claim_as_copy</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_SEARCH_NEST_FOR_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::search_nest_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_COPY_TO_NEST_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::copy_to_nest</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::go_operational</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::construct_graph</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_READ_SOURCE_TEXT_FOR_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::read_source_text_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">project_file_genre</span><span class="plain">, </span><span class="constant">GENRE_BUILDING_SOON_MTID</span><span class="plain">, </span><span class="functiontext">ProjectFileManager::building_soon</span><span class="plain">);</span>
<span class="plain">}</span>
@ -205,7 +205,7 @@ projects lived there.
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectFileManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectFileManager::construct_graph</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Projects::construct_graph</span><span class="plain">(</span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
@ -214,7 +214,7 @@ projects lived there.
<p class="endnote">The function ProjectFileManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectFileManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectFileManager::construct_graph is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Source text. </b></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>4/tm</title>
<title>4/lm</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/pm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Pipeline Manager</b></li></ul><p class="purpose">An Inform 7 pipeline.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Pipeline Manager</b></li></ul><p class="purpose">Claiming and creating copies of the pipeline genre: used for pipelines of code-generation stages.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li></ul><hr class="tocbar">
@ -253,7 +253,7 @@ since a pipeline is a single file; to sync, we just overwrite.
<p class="endnote">The function PipelineManager::copy_to_nest is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-tm.html">Back to 'Template Manager'</a></li><li><i>(This section ends Chapter 4: Managing Genres of Work.)</i></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-lm.html">Back to 'Language Manager'</a></li><li><a href="4-pbm.html">Continue with 'Project Bundle Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/tm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Managing Genres of Work</a></li><li><b>Template Manager</b></li></ul><p class="purpose">A template is the outline for a website presenting an Inform work.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Template Manager</b></li></ul><p class="purpose">Claiming and creating copies of the template genre: used for website and interpreter templates when releasing an Inform project.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li></ul><hr class="tocbar">
@ -258,7 +258,7 @@ a folder, we need to <code class="display"><span class="extract">rsync</span></c
<p class="endnote">The function TemplateManager::copy_to_nest is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-pfm.html">Back to 'Project File Manager'</a></li><li><a href="4-pm.html">Continue with 'Pipeline Manager'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-pfm.html">Back to 'Project File Manager'</a></li><li><i>(This section ends Chapter 4: Genre Management.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/kts</title>
<title>4/tm</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,9 +57,11 @@
<main role="main">
<!--Weave of '5/es' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Extension Services</b></li></ul><p class="purpose">An Inform 7 extension.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Extension Services</b></li></ul><p class="purpose">Behaviour specific to copies of the extension genre.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>An extension has a title and an author name, each of which is limited in
<ul class="toc"><li><a href="#SP1">&#167;1. Scanning metadata</a></li><li><a href="#SP3">&#167;3. Read source text</a></li><li><a href="#SP5">&#167;5. Miscellaneous</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Scanning metadata. </b>An extension has a title and an author name, each of which is limited in
length to one character less than the following constants:
</p>
@ -86,11 +88,48 @@ length to one character less than the following constants:
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">inclusion_sentence</span><span class="plain">; </span> <span class="comment">Where the source called for this</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_extension</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure inform_extension is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/kts, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This is called as soon as a new copy <code class="display"><span class="extract">C</span></code> of the extension genre is created.
We scan the extension file for the title, author, version number and any
compatibility notes given (such as "for Glulx only").
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::scan</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="functiontext">Copies::set_content</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">STORE_POINTER_inform_extension</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Initialise the extension docket</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Scan the file</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Change the edition of the copy in light of the metadata found in the scan</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::scan is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the extension docket</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;body_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-</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">E</span><span class="plain">-</span><span class="element">&gt;documentation_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
@ -103,66 +142,34 @@ length to one character less than the following constants:
<span class="identifier">E</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="identifier">E</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain"> = </span><span class="identifier">ParseTree::new_tree</span><span class="plain">();</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;inclusion_sentence</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">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_file</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>
&lt;<span class="cwebmacro">Scan the file</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) == 0) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="string">"Unknown"</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">) == 0) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">, </span><span class="string">"Anonymous"</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_TITLE_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_AUTHOR_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain"> = </span><span class="functiontext">Editions::new</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">claimed_author_name</span><span class="plain">), </span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">compatibility_specification</span><span class="plain"> *</span><span class="identifier">CS</span><span class="plain"> = </span><span class="identifier">Compatibility::from_text</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CS</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;compatibility</span><span class="plain"> = </span><span class="identifier">CS</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">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"cannot read compatibility '%S'"</span><span class="plain">, </span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::scan is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>).</p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">The structure inform_extension is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The following scans a potential extension file. If it seems malformed, a
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b>The following scans a potential extension file. If it seems malformed, a
suitable error is written to the stream <code class="display"><span class="extract">error_text</span></code>. If not, this is left
alone, and the version number is returned.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Scan the file</span> <span class="cwebmacronumber">1.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Scan the file</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">EXTF</span><span class="plain"> = </span><span class="identifier">Filenames::fopen_caseless</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EXTF</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_F</span><span class="plain">(</span><span class="constant">OPEN_FAILED_CE</span><span class="plain">, -1, </span><span class="identifier">F</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">1.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the rubric text, if any is present</span> <span class="cwebmacronumber">1.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">1.1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the rubric text, if any is present</span> <span class="cwebmacronumber">2.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">2.2.3</span>&gt;<span class="plain">;</span>
<span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">EXTF</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">version_text</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">V</span><span class="plain"> = </span><span class="identifier">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">version_text</span><span class="plain">);</span>
@ -180,15 +187,15 @@ alone, and the version number is returned.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_1"></a><b>&#167;1.1.1. </b>The titling line is terminated by any of <code class="display"><span class="extract">0A</span></code>, <code class="display"><span class="extract">0D</span></code>, <code class="display"><span class="extract">0A 0D</span></code> or <code class="display"><span class="extract">0D 0A</span></code>, or
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b>The titling line is terminated by any of <code class="display"><span class="extract">0A</span></code>, <code class="display"><span class="extract">0D</span></code>, <code class="display"><span class="extract">0A 0D</span></code> or <code class="display"><span class="extract">0D 0A</span></code>, or
by the local <code class="display"><span class="extract">\n</span></code> for good measure.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">1.1.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Read the titling line of the extension and normalise its casing</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
@ -204,9 +211,9 @@ by the local <code class="display"><span class="extract">\n</span></code> for go
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_2"></a><b>&#167;1.1.2. </b>In the following, all possible newlines are converted to white space, and
<p class="inwebparagraph"><a id="SP2_2_2"></a><b>&#167;2.2.2. </b>In the following, all possible newlines are converted to white space, and
all white space before a quoted rubric text is ignored. We need to do this
partly because users have probably keyed a double line break before the
rubric, but also because we might have stopped reading the titling line
@ -216,7 +223,7 @@ thing we read here is a meaningless <code class="display"><span class="extract">
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the rubric text, if any is present</span> <span class="cwebmacronumber">1.1.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Read the rubric text, if any is present</span> <span class="cwebmacronumber">2.2.2</span>&gt; =
</code></p>
@ -236,9 +243,9 @@ thing we read here is a meaningless <code class="display"><span class="extract">
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3"></a><b>&#167;1.1.3. </b>In general, once case-normalised, a titling line looks like this:
<p class="inwebparagraph"><a id="SP2_2_3"></a><b>&#167;2.2.3. </b>In general, once case-normalised, a titling line looks like this:
</p>
<blockquote>
@ -254,7 +261,7 @@ load the entire file.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">1.1.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Parse the version, title, author and VM requirements from the titling line</span> <span class="cwebmacronumber">2.2.3</span>&gt; =
</code></p>
@ -272,18 +279,18 @@ load the entire file.
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1,</span>
<span class="identifier">I</span><span class="string">"the opening line does not end 'begin(s) here'"</span><span class="plain">));</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">1.1.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">2.2.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"The (%c*)"</span><span class="plain">)) </span><span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">titling_line</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
&lt;<span class="cwebmacro">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">1.1.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">1.1.3.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">2.2.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">2.2.3.3</span>&gt;<span class="plain">;</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_1"></a><b>&#167;1.1.3.1. </b>We make no attempt to check the version number for validity: the purpose
<p class="inwebparagraph"><a id="SP2_2_3_1"></a><b>&#167;2.2.3.1. </b>We make no attempt to check the version number for validity: the purpose
of the census is to identify extensions and reject accidentally included
other files, not to syntax-check all extensions to see if they would work
if used.
@ -291,7 +298,7 @@ if used.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">1.1.3.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Scan the version text, if any, and advance to the position past Version... Of</span> <span class="cwebmacronumber">2.2.3.1</span>&gt; =
</code></p>
@ -304,16 +311,16 @@ if used.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_2"></a><b>&#167;1.1.3.2. </b>The earliest "by" is the divider: note that extension titles are not
<p class="inwebparagraph"><a id="SP2_2_3_2"></a><b>&#167;2.2.3.2. </b>The earliest "by" is the divider: note that extension titles are not
allowed to contain this word, so "North By Northwest By Cary Grant" is
not a situation we need to contend with.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">1.1.3.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Divide the remaining text into a claimed author name and title, divided by By</span> <span class="cwebmacronumber">2.2.3.2</span>&gt; =
</code></p>
@ -330,15 +337,15 @@ not a situation we need to contend with.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_3"></a><b>&#167;1.1.3.3. </b>Similarly, extension titles are not allowed to contain parentheses, so
<p class="inwebparagraph"><a id="SP2_2_3_3"></a><b>&#167;2.2.3.3. </b>Similarly, extension titles are not allowed to contain parentheses, so
this is unambiguous.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">1.1.3.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Extract the VM requirements text, if any, from the claimed title</span> <span class="cwebmacronumber">2.2.3.3</span>&gt; =
</code></p>
@ -351,9 +358,197 @@ this is unambiguous.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b>Note that we don't attempt to modify the <code class="display"><span class="extract">inbuild_work</span></code> structure inside
the edition; we create an entirely new <code class="display"><span class="extract">inbuild_work</span></code>. That's because they
are immutable, and need to be for the extensions dictionary to work.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Change the edition of the copy in light of the metadata found in the scan</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) == 0) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="string">"Unknown"</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">) == 0) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">, </span><span class="string">"Anonymous"</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_TITLE_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_title</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">) &gt; </span><span class="constant">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">) {</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_N</span><span class="plain">(</span><span class="constant">EXT_AUTHOR_TOO_LONG_CE</span><span class="plain">, -1, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">claimed_author_name</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain"> = </span><span class="functiontext">Editions::new</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">claimed_title</span><span class="plain">, </span><span class="identifier">claimed_author_name</span><span class="plain">), </span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">compatibility_specification</span><span class="plain"> *</span><span class="identifier">CS</span><span class="plain"> = </span><span class="identifier">Compatibility::from_text</span><span class="plain">(</span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CS</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;compatibility</span><span class="plain"> = </span><span class="identifier">CS</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">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"cannot read compatibility '%S'"</span><span class="plain">, </span><span class="identifier">reqs</span><span class="plain">);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Read source text. </b>The scan only skimmed the surface of the file, and didn't try to parse it as
natural language text with Preform. But if the extension turns out to be one
that we need to use for something, we'll need to read its full text eventually.
This is that time.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::read_source_text_for</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">doc_only</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain">) </span><span class="identifier">doc_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Concoct a synopsis for the extension to be read</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">doc_only</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</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="element">&gt;read_into_file</span><span class="plain">) {</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain"> = </span><span class="identifier">STORE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Break the text into sentences</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="identifier">E</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="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::read_source_text_for is used in 4/em (<a href="4-em.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>We concoct a textual synopsis in the form
</p>
<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">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">, </span><span class="string">"%S by %S"</span><span class="plain">,</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">,</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</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="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>Note that if there is an active project, then we are reading the extension
in order to include it in that, and so we send it to the project's syntax tree,
rather than to the extension's own one. But if we are simply examining the
extension by running <code class="display"><span class="extract">-graph</span></code> on it in the Inbuild command line, for example,
then its sentences will go to the extension's own tree.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Break the text into sentences</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">EXW</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">-&gt;</span><span class="identifier">text_read</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">3.2.2</span>&gt;<span class="character">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">Inbuild::project</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain">) </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">;</span>
<span class="identifier">Sentences::break_into_extension_copy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;body_text</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">E</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1"></a><b>&#167;3.2.1. </b>If an extension file contains the special text (outside literal mode) of
</p>
<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="SP3_2_2"></a><b>&#167;3.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">3.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">&lt;</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">body</span><span class="plain">&gt;(</span><span class="identifier">EXW</span><span class="plain">);</span>
<span class="identifier">E</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">E</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">E</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="#SP3_2">&#167;3.2</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>When the extension source text was read from its <code class="display"><span class="extract">source_file</span></code>, we
attached a reference to say which <code class="display"><span class="extract">inform_extension</span></code> it was, and here we
make use of that:
</p>
<pre class="display">
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="functiontext">Extensions::corresponding_to</span><span class="plain">(</span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">RETRIEVE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;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="functiontext">ExtensionManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::corresponding_to is used in 6/hdn (<a href="6-hdn.html#SP19">&#167;19</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Miscellaneous. </b></p>
<pre class="display">
@ -379,8 +574,8 @@ this is unambiguous.
<p class="endnote">The function Extensions::write_author_to_file appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Three pieces of information (not available when the EF is created) will
be set later on, by other parts of Inform calling the routines below.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Three pieces of information will be set later on, by other parts of Inform
calling the routines below.
</p>
<p class="inwebparagraph">The rubric text for an extension, which is double-quoted matter just below
@ -416,11 +611,11 @@ sources, collaborators, translators and so on.
<p class="endnote">The function Extensions::set_rubric appears nowhere else.</p>
<p class="endnote">The function Extensions::get_rubric is used in 5/ec (<a href="5-ec.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Extensions::get_rubric is used in 7/ec (<a href="7-ec.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Extensions::set_extra_credit appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The use option "authorial modesty" is unusual in applying to the extension
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The use option "authorial modesty" is unusual in applying to the extension
it is found in, not the whole source text. When we read it, we call one of
the following routines, depending on whether it was in an extension or in
the main source text:
@ -433,7 +628,9 @@ the main source text:
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unfound ef"</span><span class="plain">);</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;authorial_modesty</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">Extensions::set_general_authorial_modesty</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) { </span><span class="identifier">general_authorial_modesty</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; }</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_general_authorial_modesty</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">general_authorial_modesty</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::set_inclusion_sentence</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;inclusion_sentence</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
@ -454,11 +651,7 @@ the main source text:
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::must_satisfy</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;must_satisfy</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;must_satisfy</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;must_satisfy</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">)) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">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="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;must_satisfy</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::satisfies</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
@ -481,124 +674,12 @@ the main source text:
<p class="endnote">The function Extensions::make_standard is used in 4/em (<a href="4-em.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Extensions::must_satisfy is used in 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Extensions::must_satisfy is used in 6/inc (<a href="6-inc.html#SP6">&#167;6</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Extensions::satisfies appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::read_source_text_for</span><span class="plain">(</span><span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">doc_only</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain">) </span><span class="identifier">doc_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Concoct a synopsis for the extension to be read</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">synopsis</span><span class="plain">, </span><span class="identifier">doc_only</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">synopsis</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="element">&gt;read_into_file</span><span class="plain">) {</span>
<span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain"> = </span><span class="identifier">STORE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</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">E</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">-&gt;</span><span class="identifier">text_read</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.3</span>&gt;<span class="character">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">Inbuild::project</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain">) </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">;</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;body_text</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, -1);</span>
<span class="identifier">E</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="plain">}</span>
<span class="plain">}</span>
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="functiontext">Extensions::corresponding_to</span><span class="plain">(</span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">RETRIEVE_POINTER_inbuild_copy</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">-&gt;</span><span class="identifier">your_ref</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;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="functiontext">ExtensionManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::read_source_text_for is used in 4/em (<a href="4-em.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Extensions::corresponding_to is used in 6/hdn (<a href="6-hdn.html#SP19">&#167;19</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.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.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">synopsis</span><span class="plain">, </span><span class="string">"%S by %S"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</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">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.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_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Break the extension's text into body and documentation</span> <span class="cwebmacronumber">5.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">E</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">E</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">E</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">&#167;5</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-kts.html">Back to 'Kits'</a></li><li><a href="5-ed.html">Continue with 'Extension Dictionary'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 5: Genre Services.)</i></li><li><a href="5-kts.html">Continue with 'Kits'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>4/pm</title>
<title>5/es</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '5/kts' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Kits</b></li></ul><p class="purpose">A kit is a combination of Inter code with an Inform 7 extension.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Kits</b></li></ul><p class="purpose">Behaviour specific to copies of the kit genre.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li></ul><hr class="tocbar">
@ -261,23 +261,23 @@
<p class="endnote">The function Kits::read_metadata appears nowhere else.</p>
<p class="endnote">The function Kits::load is used in 5/ps (<a href="5-ps.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Kits::load is used in 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Kits::dependency appears nowhere else.</p>
<p class="endnote">The function Kits::activation appears nowhere else.</p>
<p class="endnote">The function Kits::perform_ittt is used in 5/ps (<a href="5-ps.html#SP1_1">&#167;1.1</a>).</p>
<p class="endnote">The function Kits::perform_ittt is used in 5/ps2 (<a href="5-ps2.html#SP1_1">&#167;1.1</a>).</p>
<p class="endnote">The function Kits::load_types is used in 5/ps (<a href="5-ps.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Kits::load_types is used in 5/ps2 (<a href="5-ps2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Kits::activate_plugins is used in 5/ps (<a href="5-ps.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Kits::activate_plugins is used in 5/ps2 (<a href="5-ps2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Kits::early_source_text is used in 5/ps (<a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Kits::early_source_text is used in 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
<p class="endnote">The structure inform_kit is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/es, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inform_kit is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
<p class="endnote">The structure inform_kit_ittt is private to this section.</p>
@ -292,7 +292,7 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::construct_graph</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">GOING_OPERATIONAL_INBUILD_PHASE</span><span class="plain">)</span>
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">GRAPH_CONSTRUCTION_INBUILD_PHASE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</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">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</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">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
@ -371,7 +371,7 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<p class="endnote">The structure kit_contents_section_state is private to this section.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 5: Services for the Inform Compiler.)</i></li><li><a href="5-es.html">Continue with 'Extension Services'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-es.html">Back to 'Extension Services'</a></li><li><a href="5-ls.html">Continue with 'Language Services'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ps</title>
<title>5/kts</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '5/ls' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Language Services</b></li></ul><p class="purpose">An Inform 7 language definition bundle.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Language Services</b></li></ul><p class="purpose">Behaviour specific to copies of the language genre.</p>
<ul class="toc"><li><a href="#SP3">&#167;3. Logging</a></li><li><a href="#SP4">&#167;4. Language code</a></li><li><a href="#SP5">&#167;5. Kit</a></li><li><a href="#SP6">&#167;6. Finding by name</a></li><li><a href="#SP7">&#167;7. English</a></li></ul><hr class="tocbar">
@ -112,7 +112,7 @@ of the following structure.
<p class="endnote">The function Languages::path_to_bundle appears nowhere else.</p>
<p class="endnote">The structure inform_language is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_language is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 6/vmg, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </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:
@ -235,7 +235,7 @@ detect the language of play for a story file without actually running it.
<p class="inwebparagraph"></p>
<p class="endnote">The function Languages::kit_name is used in 5/ps (<a href="5-ps.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Languages::kit_name is used in 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. 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
@ -278,10 +278,10 @@ insensitively.
<p class="inwebparagraph"></p>
<p class="endnote">The function Languages::internal_English is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Languages::internal_English is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ps.html">Back to 'Project Services'</a></li><li><a href="5-ps2.html">Continue with 'Pipeline Services'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-kts.html">Back to 'Kits'</a></li><li><a href="5-ps.html">Continue with 'Pipeline Services'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ts</title>
<title>5/ls</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,681 +57,34 @@
<main role="main">
<!--Weave of '5/ps' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Project Services</b></li></ul><p class="purpose">An Inform 7 project.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Pipeline Services</b></li></ul><p class="purpose">Behaviour specific to copies of the pipeline genre.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></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">kit_dependency</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">kit</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">because_of_language</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">because_of_kit</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">kit_dependency</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_project</span><span class="plain"> {</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_pipeline</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">as_copy</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">version</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">source_vertices</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">assumed_to_be_parser_IF</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">kits_to_include</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">kit_dependency</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_play</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_syntax</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_index</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">unblorbed_vertex</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">blorbed_vertex</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">chosen_build_target</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">syntax_tree</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fix_rng</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_project</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">inform_pipeline</span><span class="plain">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="functiontext">Projects::new_ip</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="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</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">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</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="element">&gt;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">kit_dependency</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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="element">&gt;language_of_syntax</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="element">&gt;language_of_index</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="element">&gt;chosen_build_target</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="element">&gt;unblorbed_vertex</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="element">&gt;blorbed_vertex</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="element">&gt;fix_rng</span><span class="plain"> = 0;</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain"> = </span><span class="identifier">ParseTree::new_tree</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">project</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_to_English</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">inform_language</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Languages::internal_English</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"built-in English language definition can't be found'"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_play</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_play</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_index</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_index</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_syntax</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_syntax</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::fix_rng</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seed</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;fix_rng</span><span class="plain"> = </span><span class="identifier">seed</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::not_necessarily_parser_IF</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</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">Projects::set_source_filename</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">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">P</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">manifest</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">I</span><span class="string">"Contents.txt"</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">text_stream</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">manifest</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">Projects::manifest_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">L</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</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">leafname</span><span class="plain">));</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain"> = </span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</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">LinkedLists::len</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">) == 0) &amp;&amp; (</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_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">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::manifest_helper</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="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">state</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">linked_list</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == 0) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Projects::path</span><span class="plain">(</span><span class="reserved">inform_project</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">project</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Projects::source</span><span class="plain">(</span><span class="reserved">inform_project</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">project</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">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain">,</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">because_of_language</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">because_of_kit</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_BEFORE_PHASE</span><span class="plain">(</span><span class="constant">OPERATIONAL_INBUILD_PHASE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Projects::uses_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">kit_name</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">kit_dependency</span><span class="plain">);</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain"> = </span><span class="functiontext">Kits::load</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">, </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">());</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> = </span><span class="identifier">because_of_language</span><span class="plain">;</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> = </span><span class="identifier">because_of_kit</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::uses_kit</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</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">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">name</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">void</span><span class="plain"> </span><span class="functiontext">Projects::finalise_kit_dependencies</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"BasicInformKit"</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="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain"> = </span><span class="functiontext">Languages::kit_name</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">kit_name</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</span><span class="plain">)</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"CommandParserKit"</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="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">sorted</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">kit_dependency</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">p</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">&lt;100; </span><span class="identifier">p</span><span class="plain">++) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> == </span><span class="identifier">p</span><span class="plain">)</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Using Inform kit '%S' (priority %d).\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain">);</span>
<span class="reserved">inform_pipeline</span><span class="plain"> *</span><span class="functiontext">Pipelines::new_ip</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="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">inform_pipeline</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_pipeline</span><span class="plain">);</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;as_copy</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;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">T</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::new_ip is used in 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Pipelines::new_ip is used in 4/pm (<a href="4-pm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Projects::set_to_English is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>).</p>
<p class="endnote">The function Projects::set_language_of_play is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The function Projects::get_language_of_play appears nowhere else.</p>
<p class="endnote">The function Projects::set_language_of_index appears nowhere else.</p>
<p class="endnote">The function Projects::get_language_of_index appears nowhere else.</p>
<p class="endnote">The function Projects::set_language_of_syntax appears nowhere else.</p>
<p class="endnote">The function Projects::get_language_of_syntax is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>).</p>
<p class="endnote">The function Projects::fix_rng is used in 1/ic (<a href="1-ic.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Projects::not_necessarily_parser_IF is used in 1/ic (<a href="1-ic.html#SP22">&#167;22</a>).</p>
<p class="endnote">The function Projects::set_source_filename is used in 1/ic (<a href="1-ic.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Projects::manifest_helper appears nowhere else.</p>
<p class="endnote">The function Projects::path is used in <a href="#SP3">&#167;3</a>.</p>
<p class="endnote">The function Projects::source is used in <a href="#SP4">&#167;4</a>, <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function Projects::add_kit_dependency is used in 1/ic (<a href="1-ic.html#SP22">&#167;22</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Projects::uses_kit is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Projects::finalise_kit_dependencies is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The structure kit_dependency is accessed in 3/is2 and here.</p>
<p class="endnote">The structure inform_project is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">changes_made</span><span class="plain">) {</span>
<span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Kits::perform_ittt</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">parity</span><span class="plain">))</span>
<span class="identifier">changes_made</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">This code is used in <a href="#SP1">&#167;1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::load_types</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::load_types</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::activate_plugins</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Activate plugins...\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::activate</span><span class="plain">(</span><span class="identifier">CORE_PLUGIN_NAME</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::activate_plugins</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Included"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Excluded"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::Main_defined</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;defines_Main</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">Projects::index_template</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">text_stream</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="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">)</span>
<span class="identifier">I</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::load_types appears nowhere else.</p>
<p class="endnote">The function Projects::activate_plugins is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::Main_defined appears nowhere else.</p>
<p class="endnote">The function Projects::index_template appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Every source text read into Inform is automatically prefixed by a few words
loading the fundamental "extensions" &mdash; text such as "Include Basic Inform by
Graham Nelson." If Inform were a computer, this would be the BIOS which boots
up its operating system. Each kit can contribute such extensions, so there
may be multiple sentences, which we need to count up.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::early_source_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::early_source_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CODEGEN_MODULE</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Projects::list_of_inter_libraries</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link_instruction</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">;</span>
<span class="identifier">link_instruction</span><span class="plain"> *</span><span class="identifier">link</span><span class="plain"> = </span><span class="identifier">CodeGen::LinkInstructions::new</span><span class="plain">(</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">link_instruction</span><span class="plain">, </span><span class="identifier">requirements_list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">requirements_list</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Projects::build_pathname</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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="functiontext">Projects::path</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">P</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">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inbuild::transient</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::construct_build_target</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">int</span><span class="plain"> </span><span class="identifier">releasing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">compile_only</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build_folder</span><span class="plain"> = </span><span class="functiontext">Projects::build_pathname</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">inf_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">inter_V</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">inf_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">inter_V</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">inter_V</span><span class="plain">, </span><span class="identifier">compile_using_inform7_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">inf_V</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">inf_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">inf_V</span><span class="plain">, </span><span class="identifier">inter_V</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">inf_V</span><span class="plain">, </span><span class="identifier">code_generate_using_inter_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_unblorbed_extension</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">unblorbed_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">unblorbed_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">, </span><span class="identifier">inf_V</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">, </span><span class="identifier">compile_using_inform6_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_blorbed_extension</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">blorbed_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">blorbed_F</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">-</span><span class="element">&gt;always_build_this</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">, </span><span class="identifier">package_using_inblorb_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compile_only</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">inf_V</span><span class="plain">;</span>
<span class="identifier">inf_V</span><span class="plain">-</span><span class="element">&gt;always_build_this</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">releasing</span><span class="plain">) </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">KV</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use</span><span class="plain">) </span><span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd2</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd2</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">kd2</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">Projects::graph_dependent_language</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">LV</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use</span><span class="plain">) </span><span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd2</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd2</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">L</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">, </span><span class="identifier">kd2</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">Projects::construct_graph</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">GOING_OPERATIONAL_INBUILD_PHASE</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="reserved">return</span><span class="plain">;</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">) {</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_index</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</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 Projects::early_source_text is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Projects::build_pathname appears nowhere else.</p>
<p class="endnote">The function Projects::construct_build_target is used in 1/ic (<a href="1-ic.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Projects::graph_dependent_kit appears nowhere else.</p>
<p class="endnote">The function Projects::graph_dependent_language appears nowhere else.</p>
<p class="endnote">The function Projects::construct_graph is used in 4/pbm (<a href="4-pbm.html#SP6">&#167;6</a>), 4/pfm (<a href="4-pfm.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">BadTitleSentence_SYNERROR</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::read_source_text_for</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="functiontext">Projects::finalise_kit_dependencies</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">inclusions_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>
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">,</span>
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Implied inclusions"</span><span class="plain">));</span>
<span class="identifier">ParseTree::insert_sentence</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</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>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">, </span><span class="identifier">heading_level_ANNOT</span><span class="plain">, 0);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">, </span><span class="identifier">implied_heading_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Headings::declare</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain">, </span><span class="identifier">bwc</span><span class="plain"> = -1;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">early</span><span class="plain">);</span>
<span class="functiontext">Projects::early_source_text</span><span class="plain">(</span><span class="identifier">early</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">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="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inbuild::external</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="functiontext">Projects::read_further_mandatory_text</span><span class="plain">(</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Options.txt"</span><span class="plain">));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">early_W</span><span class="plain"> = </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">wc</span><span class="plain">, </span><span class="identifier">lexer_wordcount</span><span class="plain">-1);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">early_W</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">bwc</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">wc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</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="functiontext">Projects::source</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">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</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="reserved">build_vertex</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">F</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bwc</span><span class="plain"> == -1) </span><span class="identifier">bwc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain">;</span>
<span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;source_source</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="plain">}</span>
<span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">-&gt;</span><span class="identifier">root_node</span><span class="plain">);</span>
<span class="identifier">Sentences::break</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">wc</span><span class="plain">, </span><span class="identifier">lexer_wordcount</span><span class="plain">-1), </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">bwc</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">-&gt;</span><span class="identifier">root_node</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>
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">implicit_heading</span><span class="plain">, </span><span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Invented sentences"</span><span class="plain">));</span>
<span class="identifier">ParseTree::insert_sentence</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">implicit_heading</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>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">implicit_heading</span><span class="plain">, </span><span class="identifier">heading_level_ANNOT</span><span class="plain">, 0);</span>
<span class="functiontext">Headings::declare</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">Projects::activate_plugins</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="functiontext">Inclusions::traverse</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">);</span>
<span class="functiontext">Headings::satisfy_dependencies</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">Copies::list_attached_errors</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::read_source_text_for is used in 4/pbm (<a href="4-pbm.html#SP7">&#167;7</a>), 4/pfm (<a href="4-pfm.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It might seem sensible to parse the opening sentence of the source text,
the bibliographic sentence giving title and author, by looking at the result
of sentence-breaking above. But this isn't fast enough, because the sentence
also specifies the language used, and we need to know of any non-Engkish
choice immediately. So a special hook in the <code class="display"><span class="extract">syntax</span></code> module calls the
following routine as soon as <code class="display"><span class="extract">BIBLIOGRAPHIC_NT</span></code> sentence is found; thus,
it happens during the call to <code class="display"><span class="extract">Sentences::break</span></code> above.
</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::notify_of_bibliographic_sentence</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">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>
<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">W</span><span class="plain">)) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</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="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</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="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">;</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="functiontext">Projects::set_language_of_play</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Language of play: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">);</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext">CopyErrors::new</span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">BadTitleSentence_SYNERROR</span><span class="plain">);</span>
<span class="functiontext">CopyErrors::supply_node</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">PN</span><span class="plain">);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::notify_of_bibliographic_sentence appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>This is what the top line of the main source text should look like, if it's
to declare the title and author.
</p>
<pre class="display">
<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="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</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">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ::=</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} </span><span class="identifier">by</span><span class="plain"> ... | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 2);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">T</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">TW</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">Str::clear</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">A</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="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="SP6_3"></a><b>&#167;6.3. </b>The author is sometimes given outside of quotation marks:
</p>
<blockquote>
<p>"The Large Scale Structure of Space-Time" by Lindsay Lohan</p>
</blockquote>
<p class="inwebparagraph">But not always:
</p>
<blockquote>
<p>"Greek Rural Postmen and Their Cancellation Numbers" by "will.i.am"</p>
</blockquote>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)) {</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Title: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</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">Str::get_first_char</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)) {</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">A</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">A</span><span class="plain">) &gt; 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Author: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">A</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>When Inform reads the (optional!) Options file, very early in its run, it
tries to obey any use options in the file right away &mdash; earlier even than
&lt;structural-sentence&gt;. It spots these, very crudely, as sentences which
match the following (that is, which start with "use"). Note the final full
stop &mdash; it's needed before sentence-breaking has even taken place.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">shape</span><span class="plain">&gt; ::=</span>
<span class="identifier">use</span><span class="plain"> ... .</span>
<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">Projects::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">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">Projects::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>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::read_further_mandatory_text_helper</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">line</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">unused_state</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">line</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">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">line</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">shape</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="identifier">UseOptions::set_immediate_option_flags</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::draws_from_source_file</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Projects::source</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">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</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="reserved">build_vertex</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">sf</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</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 Projects::read_further_mandatory_text is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::read_further_mandatory_text_helper appears nowhere else.</p>
<p class="endnote">The function Projects::draws_from_source_file appears nowhere else.</p>
<p class="endnote">The structure inform_pipeline is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps2, 5/ts, 6/hdn, 6/inc, 6/vmg, 7/ed, 7/ed2, 7/ec and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ts.html">Back to 'Template Services'</a></li><li><a href="5-ls.html">Continue with 'Language Services'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-ls.html">Back to 'Language Services'</a></li><li><a href="5-ps2.html">Continue with 'Project Services'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ls</title>
<title>5/ps</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,34 +57,685 @@
<main role="main">
<!--Weave of '5/ps2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Pipeline Services</b></li></ul><p class="purpose">A pipeline is a list of steps to be followed by the Inter processor forming the back end of the Inform compiler.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Project Services</b></li></ul><p class="purpose">Behaviour specific to copies of either the projectbundle or projectfile genres.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></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">inform_pipeline</span><span class="plain"> {</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">kit_dependency</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">kit</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">because_of_language</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">because_of_kit</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">kit_dependency</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_project</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">as_copy</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">version</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">source_vertices</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">assumed_to_be_parser_IF</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">kits_to_include</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">kit_dependency</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_play</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_syntax</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">language_of_index</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">unblorbed_vertex</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">blorbed_vertex</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">chosen_build_target</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">syntax_tree</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fix_rng</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_pipeline</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">inform_project</span><span class="plain">;</span>
<span class="reserved">inform_pipeline</span><span class="plain"> *</span><span class="functiontext">Pipelines::new_ip</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="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">inform_pipeline</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_pipeline</span><span class="plain">);</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;as_copy</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;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">T</span><span class="plain">;</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="functiontext">Projects::new_ip</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="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</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">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</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="element">&gt;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::null</span><span class="plain">();</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">kit_dependency</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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="element">&gt;language_of_syntax</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="element">&gt;language_of_index</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="element">&gt;chosen_build_target</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="element">&gt;unblorbed_vertex</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="element">&gt;blorbed_vertex</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="element">&gt;fix_rng</span><span class="plain"> = 0;</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain"> = </span><span class="identifier">ParseTree::new_tree</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">project</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_to_English</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">inform_language</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Languages::internal_English</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"built-in English language definition can't be found'"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_play</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_play</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_play</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_index</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_index</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_index</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::set_language_of_syntax</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">, </span><span class="reserved">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">proj</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="identifier">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="functiontext">Projects::get_language_of_syntax</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</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">proj</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::fix_rng</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seed</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;fix_rng</span><span class="plain"> = </span><span class="identifier">seed</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::not_necessarily_parser_IF</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</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">Projects::set_source_filename</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">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">P</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">manifest</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">I</span><span class="string">"Contents.txt"</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">text_stream</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">manifest</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">Projects::manifest_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">L</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</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">leafname</span><span class="plain">));</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain"> = </span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</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">LinkedLists::len</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">) == 0) &amp;&amp; (</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_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">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::manifest_helper</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="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">state</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">linked_list</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == 0) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Projects::path</span><span class="plain">(</span><span class="reserved">inform_project</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">project</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Projects::source</span><span class="plain">(</span><span class="reserved">inform_project</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">project</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">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain">,</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">because_of_language</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">because_of_kit</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_BEFORE_PHASE</span><span class="plain">(</span><span class="constant">OPERATIONAL_INBUILD_PHASE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Projects::uses_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">kit_name</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">kit_dependency</span><span class="plain">);</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain"> = </span><span class="functiontext">Kits::load</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">, </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">());</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> = </span><span class="identifier">because_of_language</span><span class="plain">;</span>
<span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> = </span><span class="identifier">because_of_kit</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::uses_kit</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</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">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">name</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">void</span><span class="plain"> </span><span class="functiontext">Projects::finalise_kit_dependencies</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"BasicInformKit"</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="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain"> = </span><span class="functiontext">Languages::kit_name</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">kit_name</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;assumed_to_be_parser_IF</span><span class="plain">)</span>
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"CommandParserKit"</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="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">sorted</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">kit_dependency</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">p</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">&lt;100; </span><span class="identifier">p</span><span class="plain">++) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> == </span><span class="identifier">p</span><span class="plain">)</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Using Inform kit '%S' (priority %d).\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Pipelines::new_ip is used in 4/pm (<a href="4-pm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Projects::new_ip is used in 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>).</p>
<p class="endnote">The structure inform_pipeline is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ls, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The function Projects::set_to_English is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>).</p>
<p class="endnote">The function Projects::set_language_of_play is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The function Projects::get_language_of_play appears nowhere else.</p>
<p class="endnote">The function Projects::set_language_of_index appears nowhere else.</p>
<p class="endnote">The function Projects::get_language_of_index appears nowhere else.</p>
<p class="endnote">The function Projects::set_language_of_syntax appears nowhere else.</p>
<p class="endnote">The function Projects::get_language_of_syntax is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>).</p>
<p class="endnote">The function Projects::fix_rng is used in 1/ic (<a href="1-ic.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Projects::not_necessarily_parser_IF is used in 1/ic (<a href="1-ic.html#SP22">&#167;22</a>).</p>
<p class="endnote">The function Projects::set_source_filename is used in 1/ic (<a href="1-ic.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Projects::manifest_helper appears nowhere else.</p>
<p class="endnote">The function Projects::path is used in <a href="#SP3">&#167;3</a>.</p>
<p class="endnote">The function Projects::source is used in <a href="#SP4">&#167;4</a>, <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function Projects::add_kit_dependency is used in 1/ic (<a href="1-ic.html#SP22">&#167;22</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Projects::uses_kit is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Projects::finalise_kit_dependencies is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The structure kit_dependency is accessed in 3/is2 and here.</p>
<p class="endnote">The structure inform_project is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps, 5/ts, 6/hdn, 6/inc, 6/vmg, 7/ed, 7/ed2, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">changes_made</span><span class="plain">) {</span>
<span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Kits::perform_ittt</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">parity</span><span class="plain">))</span>
<span class="identifier">changes_made</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">This code is used in <a href="#SP1">&#167;1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::load_types</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::load_types</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::activate_plugins</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Activate plugins...\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::activate</span><span class="plain">(</span><span class="identifier">CORE_PLUGIN_NAME</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::activate_plugins</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Included"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Excluded"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::Main_defined</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;defines_Main</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">Projects::index_template</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">text_stream</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="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">)</span>
<span class="identifier">I</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::load_types appears nowhere else.</p>
<p class="endnote">The function Projects::activate_plugins is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::Main_defined appears nowhere else.</p>
<p class="endnote">The function Projects::index_template appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Every source text read into Inform is automatically prefixed by a few words
loading the fundamental "extensions" &mdash; text such as "Include Basic Inform by
Graham Nelson." If Inform were a computer, this would be the BIOS which boots
up its operating system. Each kit can contribute such extensions, so there
may be multiple sentences, which we need to count up.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::early_source_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="functiontext">Kits::early_source_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CODEGEN_MODULE</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Projects::list_of_inter_libraries</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link_instruction</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">;</span>
<span class="identifier">link_instruction</span><span class="plain"> *</span><span class="identifier">link</span><span class="plain"> = </span><span class="identifier">CodeGen::LinkInstructions::new</span><span class="plain">(</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">link_instruction</span><span class="plain">, </span><span class="identifier">requirements_list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">requirements_list</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Projects::build_pathname</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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="functiontext">Projects::path</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">P</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">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inbuild::transient</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::construct_build_target</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">int</span><span class="plain"> </span><span class="identifier">releasing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">compile_only</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build_folder</span><span class="plain"> = </span><span class="functiontext">Projects::build_pathname</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">inf_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">inter_V</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">inf_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">inter_V</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">inter_V</span><span class="plain">, </span><span class="identifier">compile_using_inform7_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">inf_V</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">inf_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">inf_V</span><span class="plain">, </span><span class="identifier">inter_V</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">inf_V</span><span class="plain">, </span><span class="identifier">code_generate_using_inter_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_unblorbed_extension</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">unblorbed_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">unblorbed_F</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">, </span><span class="identifier">inf_V</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">, </span><span class="identifier">compile_using_inform6_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_blorbed_extension</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">blorbed_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname2</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">blorbed_F</span><span class="plain">);</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">-</span><span class="element">&gt;always_build_this</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">, </span><span class="identifier">package_using_inblorb_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">releasing</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">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compile_only</span><span class="plain">) {</span>
<span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">inf_V</span><span class="plain">;</span>
<span class="identifier">inf_V</span><span class="plain">-</span><span class="element">&gt;always_build_this</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">releasing</span><span class="plain">) </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;blorbed_vertex</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;unblorbed_vertex</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">KV</span><span class="plain"> = </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use</span><span class="plain">) </span><span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd2</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd2</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;kit</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">kd2</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">Projects::graph_dependent_language</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">LV</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use</span><span class="plain">) </span><span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd2</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd2</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd2</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">L</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">LV</span><span class="plain">, </span><span class="identifier">kd2</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">Projects::construct_graph</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">GRAPH_CONSTRUCTION_INBUILD_PHASE</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="reserved">return</span><span class="plain">;</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">) {</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_kit</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kd</span><span class="plain">-</span><span class="element">&gt;because_of_language</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Projects::graph_dependent_kit</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">kd</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_play</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_syntax</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;language_of_index</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="functiontext">Projects::graph_dependent_language</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">L</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 Projects::early_source_text is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Projects::build_pathname appears nowhere else.</p>
<p class="endnote">The function Projects::construct_build_target is used in 1/ic (<a href="1-ic.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Projects::graph_dependent_kit appears nowhere else.</p>
<p class="endnote">The function Projects::graph_dependent_language appears nowhere else.</p>
<p class="endnote">The function Projects::construct_graph is used in 4/pbm (<a href="4-pbm.html#SP6">&#167;6</a>), 4/pfm (<a href="4-pfm.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">BadTitleSentence_SYNERROR</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::read_source_text_for</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">) {</span>
<span class="functiontext">Projects::finalise_kit_dependencies</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">inclusions_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>
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">,</span>
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Implied inclusions"</span><span class="plain">));</span>
<span class="identifier">ParseTree::insert_sentence</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</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>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">, </span><span class="identifier">heading_level_ANNOT</span><span class="plain">, 0);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">inclusions_heading</span><span class="plain">, </span><span class="identifier">implied_heading_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Headings::declare</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</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">Projects::early_source_text</span><span class="plain">(</span><span class="identifier">early</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">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="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inbuild::external</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="functiontext">Projects::read_further_mandatory_text</span><span class="plain">(</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Options.txt"</span><span class="plain">));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">early_W</span><span class="plain"> = </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">wc</span><span class="plain">, </span><span class="identifier">lexer_wordcount</span><span class="plain">-1);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">inclusions_heading</span><span class="plain">);</span>
<span class="identifier">Sentences::break_into_project_copy</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">early_W</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">wc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">start_set</span><span class="plain"> = </span><span class="identifier">FALSE</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="functiontext">Projects::source</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">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</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="reserved">build_vertex</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">F</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">start_set</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">start_set</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Sentences::set_start_of_source</span><span class="plain">(</span><span class="identifier">lexer_wordcount</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;source_source</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="plain">}</span>
<span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">-&gt;</span><span class="identifier">root_node</span><span class="plain">);</span>
<span class="identifier">Sentences::break_into_project_copy</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">wc</span><span class="plain">, </span><span class="identifier">lexer_wordcount</span><span class="plain">-1), </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">l</span><span class="plain"> = </span><span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">-&gt;</span><span class="identifier">root_node</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>
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">implicit_heading</span><span class="plain">, </span><span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Invented sentences"</span><span class="plain">));</span>
<span class="identifier">ParseTree::insert_sentence</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">implicit_heading</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>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">implicit_heading</span><span class="plain">, </span><span class="identifier">heading_level_ANNOT</span><span class="plain">, 0);</span>
<span class="functiontext">Headings::declare</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="identifier">ParseTree::pop_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">ParseTree::push_attachment_point</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">implicit_heading</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">Projects::activate_plugins</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="functiontext">Inclusions::traverse</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">);</span>
<span class="functiontext">Headings::satisfy_dependencies</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">Copies::list_attached_errors</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::read_source_text_for is used in 4/pbm (<a href="4-pbm.html#SP7">&#167;7</a>), 4/pfm (<a href="4-pfm.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It might seem sensible to parse the opening sentence of the source text,
the bibliographic sentence giving title and author, by looking at the result
of sentence-breaking above. But this isn't fast enough, because the sentence
also specifies the language used, and we need to know of any non-Engkish
choice immediately. So a special hook in the <code class="display"><span class="extract">syntax</span></code> module calls the
following routine as soon as <code class="display"><span class="extract">BIBLIOGRAPHIC_NT</span></code> sentence is found; thus,
it happens during the call to <code class="display"><span class="extract">Sentences::break</span></code> above.
</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::notify_of_bibliographic_sentence</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">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>
<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">W</span><span class="plain">)) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</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="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</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="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">;</span>
<span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="functiontext">Projects::set_language_of_play</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Language of play: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">);</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext">CopyErrors::new</span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">BadTitleSentence_SYNERROR</span><span class="plain">);</span>
<span class="functiontext">CopyErrors::supply_node</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">PN</span><span class="plain">);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::notify_of_bibliographic_sentence appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>This is what the top line of the main source text should look like, if it's
to declare the title and author.
</p>
<pre class="display">
<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="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</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">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ::=</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} </span><span class="identifier">by</span><span class="plain"> ... | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 2);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">T</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">TW</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">Str::clear</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">A</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="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="SP6_3"></a><b>&#167;6.3. </b>The author is sometimes given outside of quotation marks:
</p>
<blockquote>
<p>"The Large Scale Structure of Space-Time" by Lindsay Lohan</p>
</blockquote>
<p class="inwebparagraph">But not always:
</p>
<blockquote>
<p>"Greek Rural Postmen and Their Cancellation Numbers" by "will.i.am"</p>
</blockquote>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)) {</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Title: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</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">Str::get_first_char</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)) {</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">A</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">A</span><span class="plain">) &gt; 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Author: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">A</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>When Inform reads the (optional!) Options file, very early in its run, it
tries to obey any use options in the file right away &mdash; earlier even than
&lt;structural-sentence&gt;. It spots these, very crudely, as sentences which
match the following (that is, which start with "use"). Note the final full
stop &mdash; it's needed before sentence-breaking has even taken place.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">shape</span><span class="plain">&gt; ::=</span>
<span class="identifier">use</span><span class="plain"> ... .</span>
<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">Projects::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">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">Projects::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>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::read_further_mandatory_text_helper</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">line</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">unused_state</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">line</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">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">line</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">shape</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="identifier">UseOptions::set_immediate_option_flags</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Projects::draws_from_source_file</span><span class="plain">(</span><span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</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">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Projects::source</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">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</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="reserved">build_vertex</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">sf</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</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 Projects::read_further_mandatory_text is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::read_further_mandatory_text_helper appears nowhere else.</p>
<p class="endnote">The function Projects::draws_from_source_file appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ls.html">Back to 'Language Services'</a></li><li><i>(This section ends Chapter 5: Services for the Inform Compiler.)</i></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-ps.html">Back to 'Pipeline Services'</a></li><li><a href="5-ts.html">Continue with 'Template Services'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ec</title>
<title>5/ps2</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '5/ts' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Template Services</b></li></ul><p class="purpose">An Inform 7 website template.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Template Services</b></li></ul><p class="purpose">Behaviour specific to copies of the template genre.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
@ -81,10 +81,10 @@
<p class="endnote">The function Templates::new_it is used in 4/tm (<a href="4-tm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The structure inform_template is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_template is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps, 5/ps2, 6/hdn, 6/inc, 6/vmg, 7/ed, 7/ed2, 7/ec and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ec.html">Back to 'Extension Census'</a></li><li><a href="5-ps.html">Continue with 'Project Services'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-ps2.html">Back to 'Project Services'</a></li><li><i>(This section ends Chapter 5: Genre Services.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '6/cs' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</a></li><li><b>Control Structures</b></li></ul><p class="purpose">To specify the syntax of control structures such as repeat, if and otherwise.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Control Structures</b></li></ul><p class="purpose">To specify the syntax of control structures such as repeat, if and otherwise.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Certain phrases are "structural": otherwise, if, repeat, while and so
on. These have different expectations in terms of the layout of surrounding

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '6/hdn' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</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="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</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="#SP8">&#167;8. Declarations</a></li><li><a href="#SP11_2">&#167;11.2. Parsing heading qualifiers</a></li><li><a href="#SP15">&#167;15. The heading tree</a></li><li><a href="#SP17">&#167;17. Verifying the heading tree</a></li><li><a href="#SP18">&#167;18. Miscellaneous heading services</a></li><li><a href="#SP22">&#167;22. Headings with extension dependencies</a></li></ul><hr class="tocbar">
@ -281,7 +281,7 @@ than assist.
<p class="inwebparagraph"></p>
<p class="endnote">The structure contents_entry is accessed in 5/ed, 5/ec, 6/inc and here.</p>
<p class="endnote">The structure contents_entry is accessed in 6/inc, 7/ed, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. 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
@ -378,7 +378,7 @@ and cannot contain information about releasing or about virtual machines.
<p class="endnote">The function Headings::new_heading appears nowhere else.</p>
<p class="endnote">The function Headings::declare is used in 5/ps (<a href="5-ps.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Headings::declare is used in 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP11_1"></a><b>&#167;11.1. </b>This implements the indentation algorithm described above.
</p>
@ -936,7 +936,7 @@ But when the following is called, we do know that.
<p class="inwebparagraph"></p>
<p class="endnote">The function Headings::satisfy_dependencies is used in 5/ps (<a href="5-ps.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Headings::satisfy_dependencies is used in 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </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

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '6/inc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</a></li><li><b>Inclusions</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="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Inclusions</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="#SP6">&#167;6. Extension loading</a></li><li><a href="#SP8">&#167;8. Checking the begins here and ends here sentences</a></li></ul><hr class="tocbar">
@ -115,7 +115,7 @@ guaranteed to be no INCLUDE nodes remaining in the parse tree.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inclusions::traverse is used in 4/em (<a href="4-em.html#SP8">&#167;8</a>), 5/ps (<a href="5-ps.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Inclusions::traverse is used in 4/em (<a href="4-em.html#SP8">&#167;8</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Inclusions::spawned_from_vertex is used in <a href="#SP1_1">&#167;1.1</a>, <a href="#SP6_1">&#167;6.1</a>.</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>5/ps2</title>
<title>5/ts</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '6/st' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</a></li><li><b>Source Text</b></li></ul><p class="purpose">Code for reading Inform 7 source text, which Inbuild uses for both extensions and projects.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Source Text</b></li></ul><p class="purpose">Code for reading Inform 7 source text, which Inbuild uses for both extensions and projects.</p>
<ul class="toc"><li><a href="#SP10">&#167;10. Sentence division</a></li></ul><hr class="tocbar">
@ -98,7 +98,7 @@ from multiple files and indeed from elsewhere.
<p class="inwebparagraph"></p>
<p class="endnote">The function SourceText::read_file is used in 5/es (<a href="5-es.html#SP5">&#167;5</a>), 5/ps (<a href="5-ps.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function SourceText::read_file is used in 5/es (<a href="5-es.html#SP3">&#167;3</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>This is where messages like
</p>
@ -457,7 +457,7 @@ saved up to be parsed later, so we will use the following:
<p class="endnote">The function SourceText::new_language appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 6: Handling Inform Source Text.)</i></li><li><a href="6-hdn.html">Continue with 'Headings'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 6: Inform Source Text.)</i></li><li><a href="6-hdn.html">Continue with 'Headings'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '6/vmg' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</a></li><li><b>Virtual Machine Grammar</b></li></ul><p class="purpose">Grammar for parsing natural language descriptions of a virtual machine.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Virtual Machine Grammar</b></li></ul><p class="purpose">Grammar for parsing natural language descriptions of a virtual machine.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This nonterminal corresponds to the Inbuild version number syntax in the
arch module: for example, it matches <code class="display"><span class="extract">2.7.6</span></code> or <code class="display"><span class="extract">3/990505</span></code>.
@ -102,7 +102,7 @@ with result <code class="display"><span class="extract">TRUE</span></code> if th
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="6-cs.html">Back to 'Control Structures'</a></li><li><i>(This section ends Chapter 6: Handling Inform Source Text.)</i></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="6-cs.html">Back to 'Control Structures'</a></li><li><i>(This section ends Chapter 6: Inform Source Text.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ed2</title>
<title>7/ed2</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -56,8 +56,8 @@
</nav>
<main role="main">
<!--Weave of '5/ec' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Extension Census</b></li></ul><p 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.</p>
<!--Weave of '7/ec' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#7">Chapter 7: Extension Indexing</a></li><li><b>Extension Census</b></li></ul><p 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.</p>
<ul class="toc"><li><a href="#SP3_1">&#167;3.1. Adding the extension to the census, or not</a></li><li><a href="#SP9">&#167;9. Icons for virtual machines</a></li><li><a href="#SP10">&#167;10. Displaying VM restrictions</a></li><li><a href="#SP11">&#167;11. Updating the documentation</a></li><li><a href="#SP13">&#167;13. Writing the extensions home pages</a></li></ul><hr class="tocbar">
@ -140,7 +140,7 @@ or ECD.
<p class="endnote">The function Extensions::Census::ecd_rubric is used in <a href="#SP6_7_4_1">&#167;6.7.4.1</a>, <a href="#SP6_7_4_4">&#167;6.7.4.4</a>.</p>
<p class="endnote">The structure extension_census_datum is accessed in 5/ed, 5/ed2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure extension_census_datum is accessed in 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This is a narrative section and describes the story of the census. Just as
Caesar Augustus decreed that all the world should be taxed, and that each
@ -1144,7 +1144,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Census::write_icons is used in <a href="#SP6_7_4_1_1">&#167;6.7.4.1.1</a>, 5/ed2 (<a href="5-ed2.html#SP3_2_1_2">&#167;3.2.1.2</a>).</p>
<p class="endnote">The function Extensions::Census::write_icons is used in <a href="#SP6_7_4_1_1">&#167;6.7.4.1.1</a>, 7/ed2 (<a href="7-ed2.html#SP3_2_1_2">&#167;3.2.1.2</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Updating the documentation. </b>This is done in the course of taking an extension census, which is called
for in one of two circumstances: when Inform is being run in "census mode" to
@ -1328,7 +1328,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
<p class="endnote">The function Extensions::Census::write_top_level_extensions_page is used in <a href="#SP14">&#167;14</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ed2.html">Back to 'Extension Documentation'</a></li><li><a href="5-ts.html">Continue with 'Template Services'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="7-ed2.html">Back to 'Extension Documentation'</a></li><li><i>(This section ends Chapter 7: Extension Indexing.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/es</title>
<title>6/vmg</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -56,8 +56,8 @@
</nav>
<main role="main">
<!--Weave of '5/ed' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Extension Dictionary</b></li></ul><p 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.</p>
<!--Weave of '7/ed' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#7">Chapter 7: Extension Indexing</a></li><li><b>Extension Dictionary</b></li></ul><p 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.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP8">&#167;8. Erasing entries</a></li><li><a href="#SP10">&#167;10. Making new entries</a></li><li><a href="#SP11">&#167;11. Loading from disc</a></li><li><a href="#SP13">&#167;13. Time stamping</a></li><li><a href="#SP14">&#167;14. Saving to disc</a></li><li><a href="#SP15">&#167;15. Sorting the extension dictionary</a></li><li><a href="#SP17">&#167;17. Extension clashes</a></li><li><a href="#SP20">&#167;20. Writing the HTML extension index</a></li></ul><hr class="tocbar">
@ -119,7 +119,7 @@ than the second (the right one): see below.
<p class="inwebparagraph"></p>
<p class="endnote">The structure known_extension_clash is accessed in 5/ec, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure known_extension_clash is accessed in 6/hdn, 6/inc, 7/ec and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The extension dictionary has no natural order as such. In order to generate
the dictionary page of the documentation, we will sort it alphabetically,
@ -357,7 +357,7 @@ entries, close.
<p class="endnote">The function Extensions::Dictionary::filename is used in <a href="#SP14">&#167;14</a>.</p>
<p class="endnote">The function Extensions::Dictionary::load is used in 5/ec (<a href="5-ec.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Extensions::Dictionary::load is used in 7/ec (<a href="7-ec.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP11_1"></a><b>&#167;11.1. </b>The extension dictionary file is stored only transiently and may never have
been made, or may have been wiped by a zealous mobile OS. If it doesn't exist,
@ -454,7 +454,7 @@ any truncated, overlong lines are ineffectual but safe.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Dictionary::time_stamp is used in 5/ec (<a href="5-ec.html#SP6_2">&#167;6.2</a>).</p>
<p class="endnote">The function Extensions::Dictionary::time_stamp is used in 7/ec (<a href="7-ec.html#SP6_2">&#167;6.2</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Saving to disc. </b>And inversely...
</p>
@ -485,7 +485,7 @@ any truncated, overlong lines are ineffectual but safe.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Dictionary::write_back is used in 5/ec (<a href="5-ec.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Extensions::Dictionary::write_back is used in 7/ec (<a href="7-ec.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b>We needn't worry overmuch about exceeding the maximum length, since any such
lines are handled safely by the loading code above. In any case, they could
@ -987,7 +987,7 @@ fact, the HTML rendering of the dictionary constructed above.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Dictionary::write_to_HTML is used in 5/ec (<a href="5-ec.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function Extensions::Dictionary::write_to_HTML is used in 7/ec (<a href="7-ec.html#SP15">&#167;15</a>).</p>
<p class="inwebparagraph"><a id="SP20_1"></a><b>&#167;20.1. </b>A run of N words which are all the same should appear in tinted type
throughout, while N(N-1)/2 clashes should be reported to the machinery above:
@ -1031,7 +1031,7 @@ A vs B, A vs C, then B vs C. This has O(N^2) running time, so if there are
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-es.html">Back to 'Extension Services'</a></li><li><a href="5-ed2.html">Continue with 'Extension Documentation'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 7: Extension Indexing.)</i></li><li><a href="7-ed2.html">Continue with 'Extension Documentation'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

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>5/ed</title>
<title>7/ed</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -56,8 +56,8 @@
</nav>
<main role="main">
<!--Weave of '5/ed2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Services for the Inform Compiler</a></li><li><b>Extension Documentation</b></li></ul><p class="purpose">To generate HTML documentation for extensions.</p>
<!--Weave of '7/ed2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#7">Chapter 7: Extension Indexing</a></li><li><b>Extension Documentation</b></li></ul><p class="purpose">To generate HTML documentation for extensions.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Each extension gets its own page in the external documentation area, but
this page can have two forms: the deluxe version, only produced if an
@ -78,9 +78,9 @@ understand what it entails). The following routine writes both kinds of page.
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Documentation::write_detailed is used in 5/ec (<a href="5-ec.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Extensions::Documentation::write_detailed is used in 7/ec (<a href="7-ec.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Extensions::Documentation::write_sketchy is used in 5/ec (<a href="5-ec.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Extensions::Documentation::write_sketchy is used in 7/ec (<a href="7-ec.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Thus we pass two arguments, <code class="display"><span class="extract">ecd</span></code> and <code class="display"><span class="extract">ef</span></code>, to <code class="display"><span class="extract">Extensions::Documentation::write_extension_documentation</span></code>:
one is a valid pointer, the other null. If <code class="display"><span class="extract">ef</span></code> is valid, we can write a full
@ -472,7 +472,7 @@ easily be scrolled down off screen when the user first visits the page.
<p class="endnote">The function Extensions::Documentation::load is used in <a href="#SP3_1">&#167;3.1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ed.html">Back to 'Extension Dictionary'</a></li><li><a href="5-ec.html">Continue with 'Extension Census'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="7-ed.html">Back to 'Extension Dictionary'</a></li><li><a href="7-ec.html">Continue with 'Extension Census'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -149,83 +149,71 @@
</ul>
</li>
<li>
<p><a name="4"></a><spon class="chaptertitle">Chapter 4: Managing Genres of Work</span></p>
<p><a name="4"></a><spon class="chaptertitle">Chapter 4: Genre Management</span></p>
<p><span class="purpose"></span></p>
<ul class="sectionlist">
<li>
<p><a href="4-km.html"><spon class="sectiontitle">Kit Manager</span></a> -
<span class="purpose">A kit is a combination of Inter code with an Inform 7 extension.</span></p>
<p><a href="4-em.html"><spon class="sectiontitle">Extension Manager</span></a> -
<span class="purpose">Claiming and creating copies of the extension genre: used for Inform 7 extensions.</span></p>
</li>
<li>
<p><a href="4-em.html"><spon class="sectiontitle">Extension Manager</span></a> -
<span class="purpose">An Inform 7 extension.</span></p>
<p><a href="4-km.html"><spon class="sectiontitle">Kit Manager</span></a> -
<span class="purpose">Claiming and creating copies of the kit genre: used for kits of precompiled Inter code.</span></p>
</li>
<li>
<p><a href="4-lm.html"><spon class="sectiontitle">Language Manager</span></a> -
<span class="purpose">A language is a combination of Inter code with an Inform 7 extension.</span></p>
</li>
<li>
<p><a href="4-pbm.html"><spon class="sectiontitle">Project Bundle Manager</span></a> -
<span class="purpose">A project bundle is a folder holding an Inform 7 work. The app creates these.</span></p>
</li>
<li>
<p><a href="4-pfm.html"><spon class="sectiontitle">Project File Manager</span></a> -
<span class="purpose">A project file is a plain text file of Inform 7 source text.</span></p>
</li>
<li>
<p><a href="4-tm.html"><spon class="sectiontitle">Template Manager</span></a> -
<span class="purpose">A template is the outline for a website presenting an Inform work.</span></p>
<span class="purpose">Claiming and creating copies of the language genre: used for bundles of natural language metadata in the Inform 7 compiler.</span></p>
</li>
<li>
<p><a href="4-pm.html"><spon class="sectiontitle">Pipeline Manager</span></a> -
<span class="purpose">An Inform 7 pipeline.</span></p>
<span class="purpose">Claiming and creating copies of the pipeline genre: used for pipelines of code-generation stages.</span></p>
</li>
<li>
<p><a href="4-pbm.html"><spon class="sectiontitle">Project Bundle Manager</span></a> -
<span class="purpose">Claiming and creating copies of the projectbundle genre: used for Inform 7 projects as created by the GUI apps.</span></p>
</li>
<li>
<p><a href="4-pfm.html"><spon class="sectiontitle">Project File Manager</span></a> -
<span class="purpose">Claiming and creating copies of the projectfile genre: used for Inform 7 source texts stored as stand-alone plain text files, outside the GUI apps.</span></p>
</li>
<li>
<p><a href="4-tm.html"><spon class="sectiontitle">Template Manager</span></a> -
<span class="purpose">Claiming and creating copies of the template genre: used for website and interpreter templates when releasing an Inform project.</span></p>
</li>
</ul>
</li>
<li>
<p><a name="5"></a><spon class="chaptertitle">Chapter 5: Services for the Inform Compiler</span></p>
<p><a name="5"></a><spon class="chaptertitle">Chapter 5: Genre Services</span></p>
<p><span class="purpose"></span></p>
<ul class="sectionlist">
<li>
<p><a href="5-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="5-es.html"><spon class="sectiontitle">Extension Services</span></a> -
<span class="purpose">An Inform 7 extension.</span></p>
<span class="purpose">Behaviour specific to copies of the extension genre.</span></p>
</li>
<li>
<p><a href="5-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="5-ed2.html"><spon class="sectiontitle">Extension Documentation</span></a> -
<span class="purpose">To generate HTML documentation for extensions.</span></p>
</li>
<li>
<p><a href="5-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="5-ts.html"><spon class="sectiontitle">Template Services</span></a> -
<span class="purpose">An Inform 7 website template.</span></p>
</li>
<li>
<p><a href="5-ps.html"><spon class="sectiontitle">Project Services</span></a> -
<span class="purpose">An Inform 7 project.</span></p>
<p><a href="5-kts.html"><spon class="sectiontitle">Kits</span></a> -
<span class="purpose">Behaviour specific to copies of the kit genre.</span></p>
</li>
<li>
<p><a href="5-ls.html"><spon class="sectiontitle">Language Services</span></a> -
<span class="purpose">An Inform 7 language definition bundle.</span></p>
<span class="purpose">Behaviour specific to copies of the language genre.</span></p>
</li>
<li>
<p><a href="5-ps2.html"><spon class="sectiontitle">Pipeline Services</span></a> -
<span class="purpose">A pipeline is a list of steps to be followed by the Inter processor forming the back end of the Inform compiler.</span></p>
<p><a href="5-ps.html"><spon class="sectiontitle">Pipeline Services</span></a> -
<span class="purpose">Behaviour specific to copies of the pipeline genre.</span></p>
</li>
<li>
<p><a href="5-ps2.html"><spon class="sectiontitle">Project Services</span></a> -
<span class="purpose">Behaviour specific to copies of either the projectbundle or projectfile genres.</span></p>
</li>
<li>
<p><a href="5-ts.html"><spon class="sectiontitle">Template Services</span></a> -
<span class="purpose">Behaviour specific to copies of the template genre.</span></p>
</li>
</ul>
</li>
<li>
<p><a name="6"></a><spon class="chaptertitle">Chapter 6: Handling Inform Source Text</span></p>
<p><a name="6"></a><spon class="chaptertitle">Chapter 6: Inform Source Text</span></p>
<p><span class="purpose"></span></p>
<ul class="sectionlist">
<li>
@ -250,6 +238,24 @@
</li>
</ul>
</li>
<li>
<p><a name="7"></a><spon class="chaptertitle">Chapter 7: Extension Indexing</span></p>
<p><span class="purpose"></span></p>
<ul class="sectionlist">
<li>
<p><a href="7-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="7-ed2.html"><spon class="sectiontitle">Extension Documentation</span></a> -
<span class="purpose">To generate HTML documentation for extensions.</span></p>
</li>
<li>
<p><a href="7-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>
</ul>
</li>
</ul>
<hr>

View file

@ -147,7 +147,7 @@
<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="identifier">PRINT</span><span class="plain">(</span><span class="string">"File has failed to open\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="identifier">syntax_tree</span><span class="plain"> = </span><span class="functiontext">ParseTree::new_tree</span><span class="plain">();</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Read %d words\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1);</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">save_DL</span><span class="plain"> = </span><span class="identifier">DL</span><span class="plain">;</span>
<span class="identifier">DL</span><span class="plain"> = </span><span class="constant">STDOUT</span><span class="plain">;</span>

View file

@ -93,7 +93,7 @@
<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="identifier">PRINT</span><span class="plain">(</span><span class="string">"File has failed to open\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="identifier">syntax_tree</span><span class="plain"> = </span><span class="functiontext">ParseTree::new_tree</span><span class="plain">();</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Read %d words\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1);</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">ParseTree::traverse</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="functiontext">Unit::scan_tree</span><span class="plain">);</span>
<span class="plain">}</span>

View file

@ -133,10 +133,16 @@ is probably a phrase, and so on &mdash; and the following is its state.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sfsm_in_tabbed_mode</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">sfsm_main_source_start_wn</span><span class="plain"> = -1;</span>
<span class="constant">COPY_FILE_TYPE</span><span class="plain"> *</span><span class="identifier">sfsm_copy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::set_start_of_source</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain">) {</span>
<span class="identifier">sfsm_main_source_start_wn</span><span class="plain"> = </span><span class="identifier">wn</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Sentences::set_start_of_source appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Now for the routine itself. We break into bite-sized chunks, each of which is
despatched to the <code class="display"><span class="extract">Sentences::make_node</span></code> routine with a note of the punctuation
which was used to end it. Each call to this routine represents one cycle of our
@ -145,8 +151,17 @@ finite state machine.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="reserved">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_extension</span><span class="plain">,</span>
<span class="constant">COPY_FILE_TYPE</span><span class="plain"> *</span><span class="identifier">from_copy</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bwc</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="reserved">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</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">Sentences::break_inner</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">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::break_into_project_copy</span><span class="plain">(</span><span class="reserved">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</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="constant">COPY_FILE_TYPE</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Sentences::break_inner</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">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Sentences::break_into_extension_copy</span><span class="plain">(</span><span class="reserved">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</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="constant">COPY_FILE_TYPE</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Sentences::break_inner</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">TRUE</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">Sentences::break_inner</span><span class="plain">(</span><span class="reserved">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_extension</span><span class="plain">, </span><span class="constant">COPY_FILE_TYPE</span><span class="plain"> *</span><span class="identifier">from_copy</span><span class="plain">) {</span>
<span class="reserved">while</span><span class="plain"> (((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">))) &amp;&amp; (</span><span class="identifier">compare_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="identifier">PARBREAK_V</span><span class="plain">)))</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::trim_first_word</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">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
@ -190,6 +205,12 @@ finite state machine.
<p class="endnote">The function Sentences::break appears nowhere else.</p>
<p class="endnote">The function Sentences::break_into_project_copy appears nowhere else.</p>
<p class="endnote">The function Sentences::break_into_extension_copy appears nowhere else.</p>
<p class="endnote">The function Sentences::break_inner appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>Each call to <code class="display"><span class="extract">Sentences::break</span></code> starts afresh, with no residual state
left over from previous calls. (The same cannot be said for <code class="display"><span class="extract">Sentences::make_node</span></code>,
which constructs individual sentences and is repeatedly called by us, and
@ -209,7 +230,6 @@ that is why these are global variables rather than locals in <code class="displa
<span class="identifier">sfsm_copy</span><span class="plain"> = </span><span class="identifier">from_copy</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">is_extension</span><span class="plain">) </span><span class="identifier">sfsm_extension_position</span><span class="plain"> = 1;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">sfsm_extension_position</span><span class="plain"> = 0;</span>
<span class="identifier">sfsm_main_source_start_wn</span><span class="plain"> = </span><span class="identifier">bwc</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -72,7 +72,7 @@
<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="identifier">PRINT</span><span class="plain">(</span><span class="string">"File has failed to open\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="identifier">syntax_tree</span><span class="plain"> = </span><span class="functiontext">ParseTree::new_tree</span><span class="plain">();</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Read %d words\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1);</span>
<span class="functiontext">Sentences::break</span><span class="plain">(</span><span class="identifier">syntax_tree</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">save_DL</span><span class="plain"> = </span><span class="identifier">DL</span><span class="plain">;</span>
<span class="identifier">DL</span><span class="plain"> = </span><span class="constant">STDOUT</span><span class="plain">;</span>

View file

@ -22,7 +22,7 @@ at which time the client can freely use its facilities.
@e NESTED_INBUILD_PHASE
@e PROJECTED_INBUILD_PHASE
@e TARGETED_INBUILD_PHASE
@e GOING_OPERATIONAL_INBUILD_PHASE
@e GRAPH_CONSTRUCTION_INBUILD_PHASE
@e OPERATIONAL_INBUILD_PHASE
@ We're going to use the following assertions to make sure we don't slip up.
@ -370,7 +370,7 @@ void Inbuild::set_current_vm(target_vm *VM) {
current_target_VM = VM;
}
@h The Going Operational and Operational phases.
@h The Graph Construction and Operational phases.
|inbuild| is now in the Targeted phase, then, meaning that the client has
called |Inbuild::optioneering_complete| and has been making further
preparations of its own. (For example, it could attach further kit
@ -378,20 +378,20 @@ dependencies to the shared project.) The client has one further duty to
perform: to call |Inbuild::go_operational|. After that, everything is ready
for use.
The brief "going operational" phase is used, for example, to build out
dependency graphs. We do that copy by copy. The shared project, if there is
one, goes first; then everything else known to us.
The brief "graph construction" phase is used to build out dependency graphs.
We do that copy by copy. The shared project, if there is one, goes first;
then everything else known to us.
=
inform_project *Inbuild::go_operational(void) {
RUN_ONLY_IN_PHASE(TARGETED_INBUILD_PHASE)
inbuild_phase = GOING_OPERATIONAL_INBUILD_PHASE;
inbuild_phase = GRAPH_CONSTRUCTION_INBUILD_PHASE;
inform_project *P = Inbuild::project();
if (P) Copies::go_operational(P->as_copy);
if (P) Copies::construct_graph(P->as_copy);
inbuild_copy *C;
LOOP_OVER(C, inbuild_copy)
if ((P == NULL) || (C != P->as_copy))
Copies::go_operational(C);
Copies::construct_graph(C);
inbuild_phase = OPERATIONAL_INBUILD_PHASE;
if (census_mode) Extensions::Census::handle_census_mode();
return Inbuild::project();

View file

@ -117,8 +117,8 @@ wording Copies::get_source_text(inbuild_copy *C) {
@h Going operational.
=
void Copies::go_operational(inbuild_copy *C) {
VMETHOD_CALL(C->edition->work->genre, GENRE_GO_OPERATIONAL_MTID, C);
void Copies::construct_graph(inbuild_copy *C) {
VMETHOD_CALL(C->edition->work->genre, GENRE_CONSTRUCT_GRAPH_MTID, C);
}
@h Miscellaneous Inbuild commands.

View file

@ -108,13 +108,16 @@ is scanned for metadata during claiming, only the opening line is looked at.)
This method should exist only for such genres, and it should read the source
text. It will never be called twice on the same copy.
Text should actually be read by feeding it into the lexer. Inbuild will take
of it from there.
@e GENRE_READ_SOURCE_TEXT_FOR_MTID
=
VMETHOD_TYPE(GENRE_READ_SOURCE_TEXT_FOR_MTID,
inbuild_genre *gen, inbuild_copy *C)
@ At the Going Operational phase of Inbuild, each copy is offered the chance
@ At the Graph Construction phase of Inbuild, each copy is offered the chance
to finalise its internal representation. For example, this may be when its
build graph is constructed, because we can now know for sure that there are
no further unsuspected dependencies.
@ -122,13 +125,10 @@ no further unsuspected dependencies.
This method is optional, and is called exactly once on every copy (whose genre
provides it) which has been claimed by Inbuild.
Text should actually be read by feeding it into the lexer. Inbuild will take
of it from there.
@e GENRE_GO_OPERATIONAL_MTID
@e GENRE_CONSTRUCT_GRAPH_MTID
=
VMETHOD_TYPE(GENRE_GO_OPERATIONAL_MTID,
VMETHOD_TYPE(GENRE_CONSTRUCT_GRAPH_MTID,
inbuild_genre *gen, inbuild_copy *C)
@ This method is called when a copy is about to be built or have its graph

View file

@ -1,6 +1,7 @@
[ExtensionManager::] Extension Manager.
An Inform 7 extension.
Claiming and creating copies of the extension genre: used for Inform 7
extensions.
@h Genre definition.
The |extension_genre| can be summarised as follows. Copies consist of single
@ -9,6 +10,12 @@ stored in nests, in |N/Extensions/Author/Title-vVersion.i7x|. Their build
graphs are a single vertex with no build edges, but with use edges to any
further extensions which they Include.
It may seem surprising that we do not provide a |GENRE_CONSTRUCT_GRAPH_MTID|
method. This is for efficiency reasons: we don't want to read and parse the
source text of every extension we ever see, and that's what would be needed
to make the graphs of every such extension. Instead we build out the graph
later on, as needed, just for extensions of interest: see below.
@ =
void ExtensionManager::start(void) {
extension_genre = Genres::new(I"extension", TRUE);

View file

@ -1,6 +1,7 @@
[KitManager::] Kit Manager.
A kit is a combination of Inter code with an Inform 7 extension.
Claiming and creating copies of the kit genre: used for kits of precompiled
Inter code.
@h Genre definition.
The |kit_genre| can be summarised as follows. Kits consist of directories,
@ -19,7 +20,7 @@ void KitManager::start(void) {
METHOD_ADD(kit_genre, GENRE_CLAIM_AS_COPY_MTID, KitManager::claim_as_copy);
METHOD_ADD(kit_genre, GENRE_SEARCH_NEST_FOR_MTID, KitManager::search_nest_for);
METHOD_ADD(kit_genre, GENRE_COPY_TO_NEST_MTID, KitManager::copy_to_nest);
METHOD_ADD(kit_genre, GENRE_GO_OPERATIONAL_MTID, KitManager::go_operational);
METHOD_ADD(kit_genre, GENRE_CONSTRUCT_GRAPH_MTID, KitManager::construct_graph);
METHOD_ADD(kit_genre, GENRE_BUILDING_SOON_MTID, KitManager::building_soon);
}
@ -177,6 +178,6 @@ void KitManager::building_soon(inbuild_genre *gen, inbuild_copy *C, build_vertex
*V = C->vertex;
}
void KitManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
void KitManager::construct_graph(inbuild_genre *G, inbuild_copy *C) {
Kits::construct_graph(KitManager::from_copy(C));
}

View file

@ -1,6 +1,7 @@
[LanguageManager::] Language Manager.
A language is a combination of Inter code with an Inform 7 extension.
Claiming and creating copies of the language genre: used for bundles of
natural language metadata in the Inform 7 compiler.
@h Genre definition.
The |language_genre| can be summarised as follows. Language definitions

View file

@ -1,6 +1,7 @@
[PipelineManager::] Pipeline Manager.
An Inform 7 pipeline.
Claiming and creating copies of the pipeline genre: used for pipelines of
code-generation stages.
@h Genre definition.
The |pipeline_genre| can be summarised as follows. Copies consist of single

View file

@ -1,6 +1,7 @@
[ProjectBundleManager::] Project Bundle Manager.
A project bundle is a folder holding an Inform 7 work. The app creates these.
Claiming and creating copies of the projectbundle genre: used for Inform 7
projects as created by the GUI apps.
@h Genre definition.
The |project_bundle_genre| can be summarised as follows. Copies consist of
@ -23,7 +24,7 @@ void ProjectBundleManager::start(void) {
METHOD_ADD(project_bundle_genre, GENRE_CLAIM_AS_COPY_MTID, ProjectBundleManager::claim_as_copy);
METHOD_ADD(project_bundle_genre, GENRE_SEARCH_NEST_FOR_MTID, ProjectBundleManager::search_nest_for);
METHOD_ADD(project_bundle_genre, GENRE_COPY_TO_NEST_MTID, ProjectBundleManager::copy_to_nest);
METHOD_ADD(project_bundle_genre, GENRE_GO_OPERATIONAL_MTID, ProjectBundleManager::go_operational);
METHOD_ADD(project_bundle_genre, GENRE_CONSTRUCT_GRAPH_MTID, ProjectBundleManager::construct_graph);
METHOD_ADD(project_bundle_genre, GENRE_READ_SOURCE_TEXT_FOR_MTID, ProjectBundleManager::read_source_text_for);
METHOD_ADD(project_bundle_genre, GENRE_BUILDING_SOON_MTID, ProjectBundleManager::building_soon);
}
@ -105,7 +106,7 @@ void ProjectBundleManager::building_soon(inbuild_genre *gen, inbuild_copy *C, bu
*V = project->chosen_build_target;
}
void ProjectBundleManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
void ProjectBundleManager::construct_graph(inbuild_genre *G, inbuild_copy *C) {
Projects::construct_graph(ProjectBundleManager::from_copy(C));
}

View file

@ -1,6 +1,7 @@
[ProjectFileManager::] Project File Manager.
A project file is a plain text file of Inform 7 source text.
Claiming and creating copies of the projectfile genre: used for Inform 7
source texts stored as stand-alone plain text files, outside the GUI apps.
@h Genre definition.
The |project_file_genre| can be summarised as follows. Copies consist of
@ -21,7 +22,7 @@ void ProjectFileManager::start(void) {
METHOD_ADD(project_file_genre, GENRE_CLAIM_AS_COPY_MTID, ProjectFileManager::claim_as_copy);
METHOD_ADD(project_file_genre, GENRE_SEARCH_NEST_FOR_MTID, ProjectFileManager::search_nest_for);
METHOD_ADD(project_file_genre, GENRE_COPY_TO_NEST_MTID, ProjectFileManager::copy_to_nest);
METHOD_ADD(project_file_genre, GENRE_GO_OPERATIONAL_MTID, ProjectFileManager::go_operational);
METHOD_ADD(project_file_genre, GENRE_CONSTRUCT_GRAPH_MTID, ProjectFileManager::construct_graph);
METHOD_ADD(project_file_genre, GENRE_READ_SOURCE_TEXT_FOR_MTID, ProjectFileManager::read_source_text_for);
METHOD_ADD(project_file_genre, GENRE_BUILDING_SOON_MTID, ProjectFileManager::building_soon);
}
@ -106,7 +107,7 @@ void ProjectFileManager::building_soon(inbuild_genre *gen, inbuild_copy *C, buil
*V = project->chosen_build_target;
}
void ProjectFileManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
void ProjectFileManager::construct_graph(inbuild_genre *G, inbuild_copy *C) {
Projects::construct_graph(ProjectFileManager::from_copy(C));
}

View file

@ -1,6 +1,7 @@
[TemplateManager::] Template Manager.
A template is the outline for a website presenting an Inform work.
Claiming and creating copies of the template genre: used for website and
interpreter templates when releasing an Inform project.
@h Genre definition.
The |template_genre| can be summarised as follows. Website templates

View file

@ -1,8 +1,9 @@
[Extensions::] Extension Services.
An Inform 7 extension.
Behaviour specific to copies of the extension genre.
@ An extension has a title and an author name, each of which is limited in
@h Scanning metadata.
An extension has a title and an author name, each of which is limited in
length to one character less than the following constants:
@d MAX_EXTENSION_TITLE_LENGTH 51
@ -26,10 +27,30 @@ typedef struct inform_extension {
MEMORY_MANAGEMENT
} inform_extension;
@ This is called as soon as a new copy |C| of the extension genre is created.
We scan the extension file for the title, author, version number and any
compatibility notes given (such as "for Glulx only").
=
void Extensions::scan(inbuild_copy *C) {
inform_extension *E = CREATE(inform_extension);
E->as_copy = C;
Copies::set_content(C, STORE_POINTER_inform_extension(E));
@<Initialise the extension docket@>;
TEMPORARY_TEXT(claimed_author_name);
TEMPORARY_TEXT(claimed_title);
TEMPORARY_TEXT(reqs);
semantic_version_number V = VersionNumbers::null();
@<Scan the file@>;
@<Change the edition of the copy in light of the metadata found in the scan@>;
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
DISCARD_TEXT(claimed_author_name);
DISCARD_TEXT(claimed_title);
DISCARD_TEXT(reqs);
}
@<Initialise the extension docket@> =
E->body_text = EMPTY_WORDING;
E->body_text_unbroken = FALSE;
E->documentation_text = EMPTY_WORDING;
@ -43,37 +64,6 @@ void Extensions::scan(inbuild_copy *C) {
E->syntax_tree = ParseTree::new_tree();
E->inclusion_sentence = NULL;
TEMPORARY_TEXT(claimed_author_name);
TEMPORARY_TEXT(claimed_title);
TEMPORARY_TEXT(reqs);
filename *F = C->location_if_file;
semantic_version_number V = VersionNumbers::null();
@<Scan the file@>;
if (Str::len(claimed_title) == 0) { WRITE_TO(claimed_title, "Unknown"); }
if (Str::len(claimed_author_name) == 0) { WRITE_TO(claimed_author_name, "Anonymous"); }
if (Str::len(claimed_title) > MAX_EXTENSION_TITLE_LENGTH) {
Copies::attach_error(C, CopyErrors::new_N(EXT_TITLE_TOO_LONG_CE, -1, Str::len(claimed_title)));
}
if (Str::len(claimed_author_name) > MAX_EXTENSION_AUTHOR_LENGTH) {
Copies::attach_error(C, CopyErrors::new_N(EXT_AUTHOR_TOO_LONG_CE, -1, Str::len(claimed_author_name)));
}
C->edition = Editions::new(Works::new(extension_genre, claimed_title, claimed_author_name), V);
if (Str::len(reqs) > 0) {
compatibility_specification *CS = Compatibility::from_text(reqs);
if (CS) C->edition->compatibility = CS;
else {
TEMPORARY_TEXT(err);
WRITE_TO(err, "cannot read compatibility '%S'", reqs);
Copies::attach_error(C, CopyErrors::new_T(EXT_MISWORDED_CE, -1, err));
DISCARD_TEXT(err);
}
}
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
DISCARD_TEXT(claimed_author_name);
DISCARD_TEXT(claimed_title);
DISCARD_TEXT(reqs);
}
@ The following scans a potential extension file. If it seems malformed, a
suitable error is written to the stream |error_text|. If not, this is left
alone, and the version number is returned.
@ -82,6 +72,7 @@ alone, and the version number is returned.
@<Scan the file@> =
TEMPORARY_TEXT(titling_line);
TEMPORARY_TEXT(version_text);
filename *F = C->location_if_file;
FILE *EXTF = Filenames::fopen_caseless(F, "r");
if (EXTF == NULL) {
Copies::attach_error(C, CopyErrors::new_F(OPEN_FAILED_CE, -1, F));
@ -198,7 +189,121 @@ this is unambiguous.
Str::copy(reqs, mr.exp[1]);
}
@ =
@ Note that we don't attempt to modify the |inbuild_work| structure inside
the edition; we create an entirely new |inbuild_work|. That's because they
are immutable, and need to be for the extensions dictionary to work.
@<Change the edition of the copy in light of the metadata found in the scan@> =
if (Str::len(claimed_title) == 0) { WRITE_TO(claimed_title, "Unknown"); }
if (Str::len(claimed_author_name) == 0) { WRITE_TO(claimed_author_name, "Anonymous"); }
if (Str::len(claimed_title) > MAX_EXTENSION_TITLE_LENGTH) {
Copies::attach_error(C, CopyErrors::new_N(EXT_TITLE_TOO_LONG_CE, -1, Str::len(claimed_title)));
}
if (Str::len(claimed_author_name) > MAX_EXTENSION_AUTHOR_LENGTH) {
Copies::attach_error(C, CopyErrors::new_N(EXT_AUTHOR_TOO_LONG_CE, -1, Str::len(claimed_author_name)));
}
C->edition = Editions::new(Works::new(extension_genre, claimed_title, claimed_author_name), V);
if (Str::len(reqs) > 0) {
compatibility_specification *CS = Compatibility::from_text(reqs);
if (CS) C->edition->compatibility = CS;
else {
TEMPORARY_TEXT(err);
WRITE_TO(err, "cannot read compatibility '%S'", reqs);
Copies::attach_error(C, CopyErrors::new_T(EXT_MISWORDED_CE, -1, err));
DISCARD_TEXT(err);
}
}
@h Read source text.
The scan only skimmed the surface of the file, and didn't try to parse it as
natural language text with Preform. But if the extension turns out to be one
that we need to use for something, we'll need to read its full text eventually.
This is that time.
=
void Extensions::read_source_text_for(inform_extension *E) {
filename *F = E->as_copy->location_if_file;
int doc_only = FALSE;
if (census_mode) doc_only = TRUE;
TEMPORARY_TEXT(synopsis);
@<Concoct a synopsis for the extension to be read@>;
E->read_into_file = SourceText::read_file(E->as_copy, F, synopsis, doc_only, FALSE);
DISCARD_TEXT(synopsis);
if (E->read_into_file) {
E->read_into_file->your_ref = STORE_POINTER_inbuild_copy(E->as_copy);
@<Break the text into sentences@>;
E->body_text_unbroken = FALSE;
}
}
@ We concoct a textual synopsis in the form
|"Pantomime Sausages by Mr Punch"|
to be used by |SourceFiles::read_extension_source_text| for printing to |stdout|. Since
we dare not assume |stdout| can manage characters outside the basic ASCII
range, we flatten them from general ISO to plain ASCII.
@<Concoct a synopsis for the extension to be read@> =
WRITE_TO(synopsis, "%S by %S",
E->as_copy->edition->work->title,
E->as_copy->edition->work->author_name);
LOOP_THROUGH_TEXT(pos, synopsis)
Str::put(pos,
Characters::make_filename_safe(Str::get(pos)));
@ Note that if there is an active project, then we are reading the extension
in order to include it in that, and so we send it to the project's syntax tree,
rather than to the extension's own one. But if we are simply examining the
extension by running |-graph| on it in the Inbuild command line, for example,
then its sentences will go to the extension's own tree.
@<Break the text into sentences@> =
wording EXW = E->read_into_file->text_read;
if (Wordings::nonempty(EXW))
@<Break the extension's text into body and documentation@>;
inform_project *project = Inbuild::project();
if (project) E->syntax_tree = project->syntax_tree;
Sentences::break_into_extension_copy(E->syntax_tree, E->body_text, E->as_copy);
E->body_text_unbroken = FALSE;
@ If an extension file contains the special text (outside literal mode) of
|---- Documentation ----|
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.
=
<extension-body> ::=
*** ---- documentation ---- ... | ==> TRUE
... ==> FALSE
@<Break the extension's text into body and documentation@> =
<extension-body>(EXW);
E->body_text = GET_RW(<extension-body>, 1);
if (<<r>>) E->documentation_text = GET_RW(<extension-body>, 2);
E->body_text_unbroken = TRUE; /* mark this to be sentence-broken */
@ When the extension source text was read from its |source_file|, we
attached a reference to say which |inform_extension| it was, and here we
make use of that:
=
inform_extension *Extensions::corresponding_to(source_file *sf) {
if (sf == NULL) return NULL;
inbuild_copy *C = RETRIEVE_POINTER_inbuild_copy(sf->your_ref);
if (C == NULL) return NULL;
if (C->edition->work->genre != extension_genre) return NULL;
return ExtensionManager::from_copy(C);
}
@h Miscellaneous.
=
void Extensions::write(OUTPUT_STREAM, inform_extension *E) {
if (E == NULL) WRITE("none");
else WRITE("%X", E->as_copy->edition->work);
@ -212,8 +317,8 @@ void Extensions::write_author_to_file(inform_extension *E, OUTPUT_STREAM) {
WRITE("%S", E->as_copy->edition->work->raw_author_name);
}
@ Three pieces of information (not available when the EF is created) will
be set later on, by other parts of Inform calling the routines below.
@ Three pieces of information will be set later on, by other parts of Inform
calling the routines below.
The rubric text for an extension, which is double-quoted matter just below
its "begins here" line, is parsed as a sentence and will be read as an
@ -252,7 +357,9 @@ void Extensions::set_authorial_modesty(inform_extension *E) {
if (E == NULL) internal_error("unfound ef");
E->authorial_modesty = TRUE;
}
void Extensions::set_general_authorial_modesty(void) { general_authorial_modesty = TRUE; }
void Extensions::set_general_authorial_modesty(void) {
general_authorial_modesty = TRUE;
}
void Extensions::set_inclusion_sentence(inform_extension *E, parse_node *N) {
E->inclusion_sentence = N;
@ -273,79 +380,10 @@ void Extensions::make_standard(inform_extension *E) {
void Extensions::must_satisfy(inform_extension *E, inbuild_requirement *req) {
if (E->must_satisfy == NULL) E->must_satisfy = req;
else if (VersionNumberRanges::intersect_range(E->must_satisfy->version_range, req->version_range)) {
#ifdef CORE_MODULE
Extensions::set_inclusion_sentence(E, current_sentence);
#endif
}
else VersionNumberRanges::intersect_range(E->must_satisfy->version_range, req->version_range);
}
int Extensions::satisfies(inform_extension *E) {
if (E == NULL) return FALSE;
return Requirements::meets(E->as_copy->edition, E->must_satisfy);
}
@
=
void Extensions::read_source_text_for(inform_extension *E) {
filename *F = E->as_copy->location_if_file;
int doc_only = FALSE;
if (census_mode) doc_only = TRUE;
TEMPORARY_TEXT(synopsis);
@<Concoct a synopsis for the extension to be read@>;
E->read_into_file = SourceText::read_file(E->as_copy, F, synopsis, doc_only, FALSE);
DISCARD_TEXT(synopsis);
if (E->read_into_file) {
E->read_into_file->your_ref = STORE_POINTER_inbuild_copy(E->as_copy);
wording EXW = E->read_into_file->text_read;
if (Wordings::nonempty(EXW)) @<Break the extension's text into body and documentation@>;
inform_project *project = Inbuild::project();
if (project) E->syntax_tree = project->syntax_tree;
Sentences::break(E->syntax_tree, E->body_text, TRUE, E->as_copy, -1);
E->body_text_unbroken = FALSE;
}
}
inform_extension *Extensions::corresponding_to(source_file *sf) {
if (sf == NULL) return NULL;
inbuild_copy *C = RETRIEVE_POINTER_inbuild_copy(sf->your_ref);
if (C == NULL) return NULL;
if (C->edition->work->genre != extension_genre) return NULL;
return ExtensionManager::from_copy(C);
}
@ We concoct a textual synopsis in the form
|"Pantomime Sausages by Mr Punch"|
to be used by |SourceFiles::read_extension_source_text| for printing to |stdout|. Since
we dare not assume |stdout| can manage characters outside the basic ASCII
range, we flatten them from general ISO to plain ASCII.
@<Concoct a synopsis for the extension to be read@> =
WRITE_TO(synopsis, "%S by %S", E->as_copy->edition->work->title, E->as_copy->edition->work->author_name);
LOOP_THROUGH_TEXT(pos, synopsis)
Str::put(pos,
Characters::make_filename_safe(Str::get(pos)));
@ If an extension file contains the special text (outside literal mode) of
|---- Documentation ----|
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.
=
<extension-body> ::=
*** ---- documentation ---- ... | ==> TRUE
... ==> FALSE
@<Break the extension's text into body and documentation@> =
<extension-body>(EXW);
E->body_text = GET_RW(<extension-body>, 1);
if (<<r>>) E->documentation_text = GET_RW(<extension-body>, 2);
E->body_text_unbroken = TRUE; /* mark this to be sentence-broken */

View file

@ -1,6 +1,6 @@
[Kits::] Kits.
A kit is a combination of Inter code with an Inform 7 extension.
Behaviour specific to copies of the kit genre.
@h Genre definition.
@ -201,7 +201,7 @@ If there are $S$ sections then the graph has $S+5$ vertices and $4(S+1)$ edges.
=
void Kits::construct_graph(inform_kit *K) {
RUN_ONLY_IN_PHASE(GOING_OPERATIONAL_INBUILD_PHASE)
RUN_ONLY_IN_PHASE(GRAPH_CONSTRUCTION_INBUILD_PHASE)
if (K == NULL) return;
inbuild_copy *C = K->as_copy;
pathname *P = C->location_if_path;

View file

@ -1,6 +1,6 @@
[Languages::] Language Services.
An Inform 7 language definition bundle.
Behaviour specific to copies of the language genre.
@ 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

View file

@ -1,7 +1,6 @@
[Pipelines::] Pipeline Services.
A pipeline is a list of steps to be followed by the Inter processor forming
the back end of the Inform compiler.
Behaviour specific to copies of the pipeline genre.
@ =
typedef struct inform_pipeline {

View file

@ -1,6 +1,6 @@
[Projects::] Project Services.
An Inform 7 project.
Behaviour specific to copies of either the projectbundle or projectfile genres.
@ =
typedef struct kit_dependency {
@ -319,7 +319,7 @@ void Projects::graph_dependent_language(inform_project *project, build_vertex *V
}
void Projects::construct_graph(inform_project *project) {
RUN_ONLY_IN_PHASE(GOING_OPERATIONAL_INBUILD_PHASE)
RUN_ONLY_IN_PHASE(GRAPH_CONSTRUCTION_INBUILD_PHASE)
if (project == NULL) return;
build_vertex *V = project->as_copy->vertex;
build_vertex *S;
@ -355,7 +355,7 @@ void Projects::read_source_text_for(inform_project *project) {
ParseTree::annotate_int(inclusions_heading, implied_heading_ANNOT, TRUE);
Headings::declare(project->syntax_tree, inclusions_heading);
int wc = lexer_wordcount, bwc = -1;
int wc = lexer_wordcount;
TEMPORARY_TEXT(early);
Projects::early_source_text(early, project);
if (Str::len(early) > 0) Feeds::feed_stream(early);
@ -366,22 +366,26 @@ void Projects::read_source_text_for(inform_project *project) {
wording early_W = Wordings::new(wc, lexer_wordcount-1);
int l = ParseTree::push_attachment_point(project->syntax_tree, inclusions_heading);
Sentences::break(project->syntax_tree, early_W, FALSE, project->as_copy, bwc);
Sentences::break_into_project_copy(project->syntax_tree, early_W, project->as_copy);
ParseTree::pop_attachment_point(project->syntax_tree, l);
wc = lexer_wordcount;
int start_set = FALSE;
linked_list *L = Projects::source(project);
if (L) {
build_vertex *N;
LOOP_OVER_LINKED_LIST(N, build_vertex, L) {
filename *F = N->as_file;
if (bwc == -1) bwc = lexer_wordcount;
if (start_set == FALSE) {
start_set = TRUE;
Sentences::set_start_of_source(lexer_wordcount);
}
N->as_source_file = SourceText::read_file(project->as_copy, F, N->source_source,
FALSE, TRUE);
}
}
l = ParseTree::push_attachment_point(project->syntax_tree, project->syntax_tree->root_node);
Sentences::break(project->syntax_tree, Wordings::new(wc, lexer_wordcount-1), FALSE, project->as_copy, bwc);
Sentences::break_into_project_copy(project->syntax_tree, Wordings::new(wc, lexer_wordcount-1), project->as_copy);
ParseTree::pop_attachment_point(project->syntax_tree, l);
l = ParseTree::push_attachment_point(project->syntax_tree, project->syntax_tree->root_node);

View file

@ -1,6 +1,6 @@
[Templates::] Template Services.
An Inform 7 website template.
Behaviour specific to copies of the template genre.
@ =
typedef struct inform_template {

View file

@ -28,29 +28,31 @@ Chapter 3: Incremental Builds
Inform6 Skill
Inblorb Skill
Chapter 4: Managing Genres of Work
Kit Manager
Chapter 4: Genre Management
Extension Manager
Kit Manager
Language Manager
Pipeline Manager
Project Bundle Manager
Project File Manager
Template Manager
Pipeline Manager
Chapter 5: Services for the Inform Compiler
Kit Services
Chapter 5: Genre Services
Extension Services
Extension Dictionary
Extension Documentation
Extension Census
Template Services
Project Services
Kit Services
Language Services
Pipeline Services
Project Services
Template Services
Chapter 6: Handling Inform Source Text
Chapter 6: Inform Source Text
Source Text
Headings
Inclusions
Control Structures
Virtual Machine Grammar
Chapter 7: Extension Indexing
Extension Dictionary
Extension Documentation
Extension Census

View file

@ -58,14 +58,27 @@ int sfsm_in_tabbed_mode = FALSE;
int sfsm_main_source_start_wn = -1;
COPY_FILE_TYPE *sfsm_copy = NULL;
void Sentences::set_start_of_source(int wn) {
sfsm_main_source_start_wn = wn;
}
@ Now for the routine itself. We break into bite-sized chunks, each of which is
despatched to the |Sentences::make_node| routine with a note of the punctuation
which was used to end it. Each call to this routine represents one cycle of our
finite state machine.
=
void Sentences::break(parse_node_tree *T, wording W, int is_extension,
COPY_FILE_TYPE *from_copy, int bwc) {
void Sentences::break(parse_node_tree *T, wording W) {
Sentences::break_inner(T, W, FALSE, NULL);
}
void Sentences::break_into_project_copy(parse_node_tree *T, wording W, COPY_FILE_TYPE *C) {
Sentences::break_inner(T, W, FALSE, C);
}
void Sentences::break_into_extension_copy(parse_node_tree *T, wording W, COPY_FILE_TYPE *C) {
Sentences::break_inner(T, W, TRUE, C);
}
void Sentences::break_inner(parse_node_tree *T, wording W, int is_extension, COPY_FILE_TYPE *from_copy) {
while (((Wordings::nonempty(W))) && (compare_word(Wordings::first_wn(W), PARBREAK_V)))
W = Wordings::trim_first_word(W);
if (Wordings::empty(W)) return;
@ -116,7 +129,6 @@ that is why these are global variables rather than locals in |Sentences::break|.
sfsm_copy = from_copy;
if (is_extension) sfsm_extension_position = 1;
else sfsm_extension_position = 0;
sfsm_main_source_start_wn = bwc;
@ A table is any sentence beginning with the word "Table". (Bad news for
anyone writing "Table Mountain is a room.", of course, but there are other

View file

@ -28,7 +28,7 @@ void Unit::test_tree(text_stream *arg) {
if (sf == NULL) { PRINT("File has failed to open\n"); return; }
syntax_tree = ParseTree::new_tree();
PRINT("Read %d words\n", Wordings::length(W));
Sentences::break(syntax_tree, W, FALSE, NULL, -1);
Sentences::break(syntax_tree, W);
text_stream *save_DL = DL;
DL = STDOUT;

View file

@ -71,7 +71,7 @@ void Unit::test_diagrams(text_stream *arg) {
if (sf == NULL) { PRINT("File has failed to open\n"); return; }
syntax_tree = ParseTree::new_tree();
PRINT("Read %d words\n", Wordings::length(W));
Sentences::break(syntax_tree, W, FALSE, NULL, -1);
Sentences::break(syntax_tree, W);
text_stream *save_DL = DL;
DL = STDOUT;

View file

@ -39,7 +39,7 @@ void Unit::test_problems(text_stream *arg) {
if (sf == NULL) { PRINT("File has failed to open\n"); return; }
syntax_tree = ParseTree::new_tree();
PRINT("Read %d words\n", Wordings::length(W));
Sentences::break(syntax_tree, W, FALSE, NULL, -1);
Sentences::break(syntax_tree, W);
ParseTree::traverse(syntax_tree, Unit::scan_tree);
}