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

Continued redrafting of inbuild module

This commit is contained in:
Graham Nelson 2020-04-01 20:43:13 +01:00
parent b044dc53dd
commit 567950cce4
36 changed files with 684 additions and 287 deletions

View file

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

View file

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

View file

@ -79,7 +79,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -98,7 +98,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -131,7 +131,7 @@ is run only to call other functions.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">I6T::interpreter_shared</span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">int_mode</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment_name</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">index_template</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">index_structure</span><span class="plain">) {</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain"> = 1, </span><span class="identifier">cr</span><span class="plain">, </span><span class="identifier">sfp</span><span class="plain"> = 0;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">heading_name</span><span class="plain">);</span>
@ -219,10 +219,10 @@ file.
<span class="identifier">Problems::Issue::unlocated_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">or anyway not usefully testable</span>
<span class="string">"I couldn't open a requested I6T segment: see the console "</span>
<span class="string">"output for details."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_template</span><span class="plain">) {</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">index_template</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_structure</span><span class="plain">) {</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">index_structure</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Input_File</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Filename was %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">index_template</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Filename was %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">index_structure</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::unlocated_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span> <span class="comment">or anyway not usefully testable</span>
<span class="string">"I couldn't open the template file for the index."</span><span class="plain">);</span>
<span class="plain">}</span>

View file

@ -71,7 +71,7 @@
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Languages::path_to_bundle</span><span class="plain">(</span>
<span class="identifier">Projects::get_language_of_index</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">)),</span>
<span class="identifier">Projects::index_template</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">)));</span>
<span class="identifier">Projects::index_structure</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">)));</span>
<span class="plain">}</span>
</pre>

View file

@ -124,7 +124,7 @@ file, for instance.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 3/rls (<a href="3-rls.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 3/rls (<a href="3-rls.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make the default settings</span> <span class="cwebmacronumber">3.1</span>&gt; =

View file

@ -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/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::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#SP12">&#167;12</a>, <a href="5-kts.html#SP13_1">&#167;13.1</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP4">&#167;4</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/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Inbuild::external is used in 5/ps2 (<a href="5-ps2.html#SP5">&#167;5</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/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="endnote">The function Inbuild::transient is used in 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</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

View file

@ -157,9 +157,9 @@ fields are blank.
<p class="inwebparagraph"></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 is used in 5/ps2 (<a href="5-ps2.html#SP7">&#167;7</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/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_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#SP5">&#167;5</a>, <a href="5-kts.html#SP5_1">&#167;5.1</a>, <a href="5-kts.html#SP5_3">&#167;5.3</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#SP2_3">&#167;2.3</a>), 6/st (<a href="6-st.html#SP4">&#167;4</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/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_node is used in 5/ps2 (<a href="5-ps2.html#SP7">&#167;7</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>

View file

@ -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/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="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#SP4">&#167;4</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/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::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#SP5">&#167;5</a>, <a href="5-kts.html#SP5_1">&#167;5.1</a>, <a href="5-kts.html#SP5_3">&#167;5.3</a>), 5/ps2 (<a href="5-ps2.html#SP7">&#167;7</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/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="endnote">The function Copies::list_attached_errors is used in <a href="#SP9">&#167;9</a>, 5/ps2 (<a href="5-ps2.html#SP5">&#167;5</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>

View file

@ -247,7 +247,7 @@ others:
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::search_for_best 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">&#167;6.1</a>).</p>
<p class="endnote">The function Nests::search_for_best 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#SP8">&#167;8</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Where "better" is defined as follows. This innocent-looking function is
in fact critical to what Inbuild does. It uses tags on nests to prefer copies

View file

@ -107,9 +107,9 @@ we can give a semantic version number range:
<p class="inwebparagraph"></p>
<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::new is used in 5/kts (<a href="5-kts.html#SP5_3">&#167;5.3</a>), 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/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::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#SP5_4">&#167;5.4</a>, <a href="5-kts.html#SP8">&#167;8</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>), 7/ec (<a href="7-ec.html#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/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>
<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#SP13_4">&#167;13.4</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

@ -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/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 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#SP5_3">&#167;5.3</a>, <a href="5-kts.html#SP5_4">&#167;5.4</a>, <a href="5-kts.html#SP8">&#167;8</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>

View file

@ -155,9 +155,9 @@ 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/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::file_vertex is used in <a href="#SP3">&#167;3</a>, 5/kts (<a href="5-kts.html#SP13">&#167;13</a>, <a href="5-kts.html#SP13_1">&#167;13.1</a>, <a href="5-kts.html#SP13_3">&#167;13.3</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP4">&#167;4</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>
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP13_4">&#167;13.4</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Note that each copy is assigned exactly one copy vertex, when it is created.
This function should never otherwise be called.
@ -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/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_build is used in 5/kts (<a href="5-kts.html#SP13_1">&#167;13.1</a>, <a href="5-kts.html#SP13_2">&#167;13.2</a>, <a href="5-kts.html#SP13_3">&#167;13.3</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</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/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="endnote">The function Graphs::need_this_to_use is used in 5/kts (<a href="5-kts.html#SP13_4">&#167;13.4</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</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

@ -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/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP13_1">&#167;13.1</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</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

@ -107,7 +107,7 @@ the metadata file.
<p class="inwebparagraph"></p>
<p class="endnote">The function KitManager::path_within_nest is used in <a href="#SP5">&#167;5</a>, <a href="#SP6">&#167;6</a>, 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function KitManager::path_within_nest is used in <a href="#SP5">&#167;5</a>, <a href="#SP6">&#167;6</a>, 5/kts (<a href="5-kts.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Kit copies are annotated with a structure called an <code class="display"><span class="extract">inform_kit</span></code>,
which stores data about extensions used by the Inform compiler.
@ -145,7 +145,7 @@ which stores data about extensions used by the Inform compiler.
<p class="inwebparagraph"></p>
<p class="endnote">The function KitManager::from_copy is used in <a href="#SP7">&#167;7</a>, 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function KitManager::from_copy is used in <a href="#SP7">&#167;7</a>, 5/kts (<a href="5-kts.html#SP5">&#167;5</a>, <a href="5-kts.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function KitManager::new_copy is used in <a href="#SP4">&#167;4</a>.</p>

View file

@ -59,111 +59,146 @@
<!--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: 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">
<ul class="toc"><li><a href="#SP1">&#167;1. Scanning metadata</a></li><li><a href="#SP8">&#167;8. The kits included by a project</a></li><li><a href="#SP10">&#167;10. Kind definitions</a></li><li><a href="#SP11">&#167;11. Language element activation</a></li><li><a href="#SP12">&#167;12. Early source</a></li><li><a href="#SP13">&#167;13. Build graph</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Scanning metadata. </b>Metadata for kits is stored in the following structure. "Attachment" for a
kit is the process of taking the Inter code from a binary Inter file in the
kit directory and merging it into code already generated by the <code class="display"><span class="extract">core</span></code>
module of <code class="display"><span class="extract">inform7</span></code>.
</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_kit</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">text_stream</span><span class="plain"> *</span><span class="identifier">attachment_point</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">early_source</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">attachment_point</span><span class="plain">; </span> <span class="comment">where in the Inter hierarchy to attach this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">priority</span><span class="plain">; </span> <span class="comment">lower kits are attached before higher ones</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">early_source</span><span class="plain">; </span> <span class="comment">additional source text to spool in</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">ittt</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inform_kit_ittt</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">kind_definitions</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">text_stream</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">extensions</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inbuild_requirement</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">activations</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">element_activation</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">index_template</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defines_Main</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">supports_inform_language</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">priority</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">index_structure</span><span class="plain">; </span> <span class="comment">for indexing projects using this kit</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defines_Main</span><span class="plain">; </span> <span class="comment">does the Inter code in this kit define the <code class="display"><span class="extract">Main</span></code> routine?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">supports_nl</span><span class="plain">; </span> <span class="comment">does the Inter code in this kit support a natural language extension?</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_kit</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></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="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Kits come with an "if this then that" service for including other kits,
and we represent rules with the following:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit_ittt</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">if_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">if_included</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">then_name</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_kit_ittt</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure inform_kit_ittt is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Kits can also enable elements of the Inform programming language: that is,
enable compiler support for them. For example, the WorldModelKit enables
interactive fiction features of the compiler, but BasicInformKit does not.
</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">element_activation</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">element_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">activate</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">element_activation</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure element_activation is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Here goes, then:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::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">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="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy to scan"</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">CREATE</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="element">&gt;as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy to scan"</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_kit</span><span class="plain">(</span><span class="identifier">K</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">Str::new</span><span class="plain">();</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">, </span><span class="string">"/main/%S"</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;title</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = 10;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</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">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_structure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_inform_language</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</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">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">Kits::read_metadata</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">C</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</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="string">"/main/%S"</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;title</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::scan is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The following reads line by line through the <code class="display"><span class="extract">kit_metadata.txt</span></code> file:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::read_metadata</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="reserved">inbuild_copy</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="identifier">state</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="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">text</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">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *#%c*"</span><span class="plain">))) {</span>
<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"version: (%C+)"</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"version: (%C+)"</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;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"compatibility: (%c+)"</span><span class="plain">)) {</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</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">KIT_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="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: yes"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: no"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: yes"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_inform_language</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: no"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_inform_language</span><span class="plain"> = </span><span class="identifier">FALSE</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"insert: (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"priority: (%d*)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"compatibility: (%c+)"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Add compatibility</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: yes"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">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">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: no"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: yes"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">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">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: no"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"insert: (%c*)"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Add early source</span> <span class="cwebmacronumber">5.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"priority: (%d*)"</span><span class="plain">))</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], 0);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"kinds: (%C+)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"kinds: (%C+)"</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: (%c+) by (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"activate: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: version (%c+?) of (%c+) by (%c+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Add versioned extension</span> <span class="cwebmacronumber">5.3</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: (%c+) by (%c+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Add unversioned extension</span> <span class="cwebmacronumber">5.4</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"activate: (%c+)"</span><span class="plain">))</span>
<span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"deactivate: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"deactivate: (%c+)"</span><span class="plain">))</span>
<span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">FALSE</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if (%C+) then (%C+)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if (%C+) then (%C+)"</span><span class="plain">))</span>
<span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="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">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if not (%C+) then (%C+)"</span><span class="plain">)) {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if not (%C+) then (%C+)"</span><span class="plain">))</span>
<span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="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">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"index from: (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"index from: (%c*)"</span><span class="plain">))</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_structure</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="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">"unreadable instruction '%S'"</span><span class="plain">, </span><span class="identifier">text</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">KIT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
@ -171,16 +206,91 @@
<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>
<span class="plain">}</span>
</pre>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">Kits::load</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">linked_list</span><span class="plain"> *</span><span class="identifier">nest_list</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="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">));</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">nest_list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Errors::fatal_with_text</span><span class="plain">(</span><span class="string">"cannot find kit"</span><span class="plain">, </span><span class="identifier">name</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">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">;</span>
<span class="reserved">return</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>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::read_metadata is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add compatibility</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</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">KIT_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>
</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><code class="display">
&lt;<span class="cwebmacrodefn">Add early source</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</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_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add versioned extension</span> <span class="cwebmacronumber">5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[2]);</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::from_text</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">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 version number '%S'"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="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">KIT_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="reserved">else</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="functiontext">Requirements::new</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">,</span>
<span class="identifier">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">));</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">);</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_4"></a><b>&#167;5.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add unversioned extension</span> <span class="cwebmacronumber">5.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</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">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We provide if this then that, where <code class="display"><span class="extract">inc</span></code> is true, and if this then not that,
where it's false.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::dependency</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">text_stream</span><span class="plain"> *</span><span class="identifier">if_text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">inc</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">then_text</span><span class="plain">) {</span>
<span class="reserved">inform_kit_ittt</span><span class="plain"> *</span><span class="identifier">ITTT</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">if_text</span><span class="plain">);</span>
@ -188,14 +298,58 @@
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">then_text</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">, </span><span class="reserved">inform_kit_ittt</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::dependency is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Language elements can similarly be activated or deactivated, though the
latter may not be useful in practice:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::activation</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">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">act</span><span class="plain">) {</span>
<span class="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain"> = </span><span class="identifier">act</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::activation is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. The kits included by a project. </b>A project can call this to obtain the <code class="display"><span class="extract">inform_kit</span></code> structure for the copy of
a kit, going only on a name such as <code class="display"><span class="extract">BasicInformKit</span></code>:
</p>
<pre class="display">
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">Kits::find_by_name</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">linked_list</span><span class="plain"> *</span><span class="identifier">nest_list</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="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">));</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">nest_list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Errors::fatal_with_text</span><span class="plain">(</span><span class="string">"cannot find kit"</span><span class="plain">, </span><span class="identifier">name</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">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">;</span>
<span class="reserved">return</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>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::find_by_name is used in 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>The ITTT process for a project calls this to see if the ITTT rules for
a <code class="display"><span class="extract">K</span></code> require further kit dependencies to be added to the project: if they
do, then the dependencies are added and we return <code class="display"><span class="extract">TRUE</span></code>. If there was
nothing to do, we return <code class="display"><span class="extract">FALSE</span></code>.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kits::perform_ittt</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="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">parity</span><span class="plain">) {</span>
<span class="reserved">int</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">inform_kit_ittt</span><span class="plain"> *</span><span class="identifier">ITTT</span><span class="plain">;</span>
@ -208,7 +362,20 @@
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">changes_made</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></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="inwebparagraph"><a id="SP10"></a><b>&#167;10. Kind definitions. </b>The base kinds for the Inform language, such as "real number" or "text", are
not defined in high-level source text, nor by Inter, but by special configuration
files held in the <code class="display"><span class="extract">kinds</span></code> subdirectory of the kits used. The following function
loads the base kinds in a kit <code class="display"><span class="extract">K</span></code>:
</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">Kits::load_types</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">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">;</span>
@ -220,16 +387,30 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></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="inwebparagraph"><a id="SP11"></a><b>&#167;11. Language element activation. </b>Note that this function is meaningful only when this module is part of the
<code class="display"><span class="extract">inform7</span></code> executable, and it invites us to activate or deactivate language
features as <code class="display"><span class="extract">K</span></code> would like.
</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">Kits::activate_plugins</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::activate_elements</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="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Plugins::Manage::parse</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == -1)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">),</span>
<span class="string">"one of the Inform kits made reference to a language segment which does not exist"</span><span class="plain">,</span>
<span class="string">"which strongly suggests that Inform is not properly installed."</span><span class="plain">);</span>
<span class="string">"one of the Inform kits made reference to a language segment "</span>
<span class="string">"which does not exist"</span><span class="plain">,</span>
<span class="string">"which suggests that Inform is not properly installed, unless "</span>
<span class="string">"you are experimenting with new kits."</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> &gt;= 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain">) </span><span class="identifier">Plugins::Manage::activate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Plugins::Manage::deactivate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
@ -237,11 +418,36 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::activate_elements is used in 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Early source. </b>As we have seen, kits can ask for extensions to be included.
</p>
<p class="inwebparagraph">As a last resort, a kit can also ask for a sentence or two to be mandatorily
included in the source text for any project using it. This text appears very
early on, and can't do much, but could for example set use options.
</p>
<p class="inwebparagraph">This function simply writes out such sentences, so that they can be fed
into the lexer by our caller.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::early_source_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Include %S by %S.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</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">req</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_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Include "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_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="identifier">FALSE</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">req</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">-&gt;</span><span class="identifier">lower</span><span class="plain">.</span><span class="identifier">end_value</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"version %v of "</span><span class="plain">, &amp;</span><span class="identifier">V</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S by %S.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</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">req</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">);</span>
<span class="plain">}</span>
@ -257,38 +463,21 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::scan is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Kits::read_metadata appears nowhere else.</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/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/ps2 (<a href="5-ps2.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/ps2 (<a href="5-ps2.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#SP4">&#167;4</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/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>
<p class="endnote">The structure element_activation is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The build graph for a kit is quite extensive, since a kit contains Inter
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Build graph. </b>The build graph for a kit is quite extensive, since a kit contains Inter
binaries for four different architectures; and each of those has a
dependency on every section file of the web of Inform 6 source for the kit.
If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
</p>
<p class="inwebparagraph">Note that ITTT rules do not affect the build graph; they affect only how a
project uses the kit, and therefore they affect the project's build graph but
not ours.
</p>
<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>
@ -296,8 +485,33 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<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>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">KV</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="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">BVL</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="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">KV</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="comment">the kit vertex</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">BVL</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="comment">list of vertices for the binaries</span>
&lt;<span class="cwebmacro">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</span>&gt;<span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</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><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">CV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">); </span> <span class="comment">the contents page vertex</span>
&lt;<span class="cwebmacro">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>&gt;<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">Kits::find_sections</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</span>&gt;<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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::construct_graph is used in 4/km (<a href="4-km.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">inter_architecture</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">BV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">Architectures::canonical_binary</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">));</span>
@ -306,19 +520,35 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<span class="functiontext">Inbuild::nest_list</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">A</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">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">BVL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</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><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">CV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">);</span>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_2"></a><b>&#167;13.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">BV</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">BVL</span><span class="plain">)</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="identifier">CV</span><span class="plain">);</span>
</pre>
<span class="reserved">kit_contents_section_state</span><span class="plain"> </span><span class="identifier">CSS</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.active</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.sects</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">contents_page</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">Kits::read_contents</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">CSS</span><span class="plain">);</span>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_3"></a><b>&#167;13.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">CSS</span><span class="element">.sects</span><span class="plain">) {</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">segment</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="identifier">filename</span><span class="plain"> *</span><span class="identifier">SF</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</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><span class="identifier">I</span><span class="string">"Sections"</span><span class="plain">), </span><span class="identifier">segment</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">SV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
@ -326,22 +556,53 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">BVL</span><span class="plain">)</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="identifier">SV</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inform_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Requirements::meets</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="identifier">req</span><span class="plain">)) {</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</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;vertex</span><span class="plain">);</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">RV</span><span class="plain"> = </span><span class="functiontext">Graphs::req_vertex</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">RV</span><span class="plain">);</span>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_4"></a><b>&#167;13.4. </b>Suppose our kit wants to include Locksmith by Emily Short. If that's an
extension we have already read in, we can place a use edge to its existing
build vertex. If not, the best we can do is a use edge to a requirement
vertex, i.e., to a vertex meaning "we would like Locksmith but can't find it".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inform_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Requirements::meets</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="identifier">req</span><span class="plain">)) {</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</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;vertex</span><span class="plain">);</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">RV</span><span class="plain"> = </span><span class="functiontext">Graphs::req_vertex</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">RV</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p>
<pre class="display">
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Kits::find_sections</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain">) {</span>
<span class="reserved">kit_contents_section_state</span><span class="plain"> </span><span class="identifier">CSS</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.active</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.sects</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">contents_page</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">Kits::read_contents</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">CSS</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CSS</span><span class="element">.sects</span><span class="plain">;</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_contents_section_state</span><span class="plain"> {</span>
@ -364,7 +625,7 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::construct_graph is used in 4/km (<a href="4-km.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Kits::find_sections is used in <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">The function Kits::read_contents appears nowhere else.</p>

View file

@ -59,6 +59,8 @@
<!--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: 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>
<ul class="toc"><li><a href="#SP3">&#167;3. Language element activation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
@ -193,7 +195,7 @@
<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;kit</span><span class="plain"> = </span><span class="functiontext">Kits::find_by_name</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>
@ -243,7 +245,7 @@
<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::set_language_of_play is used in <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function Projects::get_language_of_play appears nowhere else.</p>
@ -263,15 +265,15 @@
<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::path is used in <a href="#SP4">&#167;4</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::source is used in <a href="#SP5">&#167;5</a>, <a href="#SP8">&#167;8</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::add_kit_dependency is used in 1/ic (<a href="1-ic.html#SP22">&#167;22</a>), 5/kts (<a href="5-kts.html#SP9">&#167;9</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::uses_kit is used in 5/kts (<a href="5-kts.html#SP9">&#167;9</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 function Projects::finalise_kit_dependencies is used in <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The structure kit_dependency is accessed in 3/is2 and here.</p>
@ -308,14 +310,26 @@
<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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::load_types appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Language element activation. </b>Note that this function is meaningful only when this module is part of the
<code class="display"><span class="extract">inform7</span></code> executable, and it invites us to activate or deactivate language
features according to what our kits tell us.
</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::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="reserved">void</span><span class="plain"> </span><span class="functiontext">Projects::activate_elements</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 elements...\</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="functiontext">Kits::activate_elements</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>
@ -329,27 +343,25 @@
<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="functiontext">Projects::index_structure</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">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_structure</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_structure</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::activate_elements is used in <a href="#SP5">&#167;5</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="endnote">The function Projects::index_structure 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
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </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
@ -468,7 +480,7 @@ may be multiple sentences, which we need to count up.
<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::early_source_text is used in <a href="#SP5">&#167;5</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>
@ -482,7 +494,7 @@ may be multiple sentences, which we need to count up.
<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>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="definitions">
@ -547,7 +559,7 @@ may be multiple sentences, which we need to count up.
<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="functiontext">Projects::activate_elements</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>
@ -562,7 +574,7 @@ may be multiple sentences, which we need to count up.
<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,
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </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
@ -571,7 +583,7 @@ following routine as soon as <code class="display"><span class="extract">BIBLIOG
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>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
@ -587,8 +599,8 @@ it happens during the call to <code class="display"><span class="extract">Senten
<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>
&lt;<span class="cwebmacro">Extract title and author name wording</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">7.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>
@ -601,7 +613,7 @@ it happens during the call to <code class="display"><span class="extract">Senten
<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
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.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>
@ -618,8 +630,8 @@ to declare the title and author.
<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; =
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Extract title and author name wording</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
@ -637,9 +649,9 @@ to declare the title and author.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</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 class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b>The author is sometimes given outside of quotation marks:
</p>
<blockquote>
@ -657,7 +669,7 @@ to declare the title and author.
<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; =
&lt;<span class="cwebmacrodefn">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
@ -680,9 +692,9 @@ to declare the title and author.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</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
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </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
@ -728,7 +740,7 @@ stop &mdash; it's needed before sentence-breaking has even taken place.
<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 is used in <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function Projects::read_further_mandatory_text_helper appears nowhere else.</p>

View file

@ -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/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Headings::declare is used in 5/ps2 (<a href="5-ps2.html#SP5">&#167;5</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/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Headings::satisfy_dependencies is used in 5/ps2 (<a href="5-ps2.html#SP5">&#167;5</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

@ -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/ps2 (<a href="5-ps2.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#SP5">&#167;5</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

@ -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#SP3">&#167;3</a>), 5/ps2 (<a href="5-ps2.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#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>This is where messages like
</p>

View file

@ -104,7 +104,7 @@ on; then to carry out that work, and then shut down again.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 1/ic (<a href="1-ic.html#SP23">&#167;23</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/ic (<a href="1-ic.html#SP23">&#167;23</a>), 5/kts (<a href="5-kts.html#SP4">&#167;4</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">2.1</span>&gt; =

View file

@ -72,7 +72,7 @@ chosen format, a process we'll call "rendering". We do this in two passes.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/haj (<a href="2-haj.html#SP24">&#167;24</a>), 3/cai (<a href="3-cai.html#SP9_1">&#167;9.1</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 2/haj (<a href="2-haj.html#SP24">&#167;24</a>), 3/cai (<a href="3-cai.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. Starting up. </b></p>

View file

@ -119,7 +119,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -99,7 +99,7 @@ when they want I7 to run.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/ic (<a href="1-ic.html#SP23">&#167;23</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>), 4/am (<a href="4-am.html#SP25_1">&#167;25.1</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 22/ph (<a href="22-ph.html#SP4">&#167;4</a>), 22/pu (<a href="22-pu.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 3/fc (<a href="3-fc.html#SP1">&#167;1</a>), 3/sm (<a href="3-sm.html#SP36">&#167;36</a>, <a href="3-sm.html#SP36_1">&#167;36.1</a>, <a href="3-sm.html#SP38">&#167;38</a>), 3/em2 (<a href="3-em2.html#SP24">&#167;24</a>), 4/ap (<a href="4-ap.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/ic (<a href="1-ic.html#SP23">&#167;23</a>), 5/kts (<a href="5-kts.html#SP4">&#167;4</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>), 4/am (<a href="4-am.html#SP25_1">&#167;25.1</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 22/ph (<a href="22-ph.html#SP4">&#167;4</a>), 22/pu (<a href="22-pu.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 3/fc (<a href="3-fc.html#SP1">&#167;1</a>), 3/sm (<a href="3-sm.html#SP36">&#167;36</a>, <a href="3-sm.html#SP36_1">&#167;36.1</a>, <a href="3-sm.html#SP38">&#167;38</a>), 3/em2 (<a href="3-em2.html#SP24">&#167;24</a>), 4/ap (<a href="4-ap.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Main::deputy appears nowhere else.</p>

View file

@ -83,7 +83,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::disallow appears nowhere else.</p>

View file

@ -68,7 +68,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>We use Foundation to read the command line:
</p>

View file

@ -123,7 +123,7 @@ also done with a pipeline.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 3/fc (<a href="3-fc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/bs (<a href="1-bs.html#SP2">&#167;2</a>), 3/fc (<a href="3-fc.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">2.1</span>&gt; =

View file

@ -98,7 +98,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -92,7 +92,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -90,7 +90,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -83,7 +83,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main appears nowhere else.</p>
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Main::respond appears nowhere else.</p>

View file

@ -2,24 +2,34 @@
Behaviour specific to copies of the kit genre.
@h Genre definition.
@h Scanning metadata.
Metadata for kits is stored in the following structure. "Attachment" for a
kit is the process of taking the Inter code from a binary Inter file in the
kit directory and merging it into code already generated by the |core|
module of |inform7|.
=
typedef struct inform_kit {
struct inbuild_copy *as_copy;
struct text_stream *attachment_point;
struct text_stream *early_source;
struct text_stream *attachment_point; /* where in the Inter hierarchy to attach this */
int priority; /* lower kits are attached before higher ones */
struct text_stream *early_source; /* additional source text to spool in */
struct linked_list *ittt; /* of |inform_kit_ittt| */
struct linked_list *kind_definitions; /* of |text_stream| */
struct linked_list *extensions; /* of |inbuild_requirement| */
struct linked_list *activations; /* of |element_activation| */
struct text_stream *index_template;
int defines_Main;
int supports_inform_language;
int priority;
struct text_stream *index_structure; /* for indexing projects using this kit */
int defines_Main; /* does the Inter code in this kit define the |Main| routine? */
int supports_nl; /* does the Inter code in this kit support a natural language extension? */
MEMORY_MANAGEMENT
} inform_kit;
@ Kits come with an "if this then that" service for including other kits,
and we represent rules with the following:
=
typedef struct inform_kit_ittt {
struct text_stream *if_name;
int if_included;
@ -27,83 +37,80 @@ typedef struct inform_kit_ittt {
MEMORY_MANAGEMENT
} inform_kit_ittt;
@ Kits can also enable elements of the Inform programming language: that is,
enable compiler support for them. For example, the WorldModelKit enables
interactive fiction features of the compiler, but BasicInformKit does not.
=
typedef struct element_activation {
struct text_stream *element_name;
int activate;
MEMORY_MANAGEMENT
} element_activation;
void Kits::scan(inbuild_copy *C) {
if (C == NULL) internal_error("no copy to scan");
@ Here goes, then:
=
void Kits::scan(inbuild_copy *C) {
inform_kit *K = CREATE(inform_kit);
K->as_copy = C;
if (C == NULL) internal_error("no copy to scan");
Copies::set_content(C, STORE_POINTER_inform_kit(K));
K->attachment_point = Str::new();
K->early_source = NULL;
WRITE_TO(K->attachment_point, "/main/%S", C->edition->work->title);
K->priority = 10;
K->early_source = NULL;
K->ittt = NEW_LINKED_LIST(inform_kit_ittt);
K->kind_definitions = NEW_LINKED_LIST(text_stream);
K->extensions = NEW_LINKED_LIST(inbuild_requirement);
K->activations = NEW_LINKED_LIST(element_activation);
K->index_structure = NULL;
K->defines_Main = FALSE;
K->supports_inform_language = FALSE;
K->index_template = NULL;
K->supports_nl = FALSE;
filename *F = Filenames::in_folder(C->location_if_path, I"kit_metadata.txt");
TextFiles::read(F, FALSE,
NULL, FALSE, Kits::read_metadata, NULL, (void *) C);
WRITE_TO(K->attachment_point, "/main/%S", C->edition->work->title);
}
@ The following reads line by line through the |kit_metadata.txt| file:
=
void Kits::read_metadata(text_stream *text, text_file_position *tfp, void *state) {
inbuild_copy *C = (inbuild_copy *) state;
inform_kit *K = KitManager::from_copy(C);
match_results mr = Regexp::create_mr();
if ((Str::is_whitespace(text)) || (Regexp::match(&mr, text, L" *#%c*"))) {
;
} else if (Regexp::match(&mr, text, L"version: (%C+)")) {
} else if (Regexp::match(&mr, text, L"version: (%C+)"))
C->edition->version = VersionNumbers::from_text(mr.exp[0]);
} else if (Regexp::match(&mr, text, L"compatibility: (%c+)")) {
compatibility_specification *CS = Compatibility::from_text(mr.exp[0]);
if (CS) C->edition->compatibility = CS;
else {
TEMPORARY_TEXT(err);
WRITE_TO(err, "cannot read compatibility '%S'", mr.exp[0]);
Copies::attach_error(C, CopyErrors::new_T(KIT_MISWORDED_CE, -1, err));
DISCARD_TEXT(err);
}
} else if (Regexp::match(&mr, text, L"defines Main: yes")) {
K->defines_Main = TRUE;
} else if (Regexp::match(&mr, text, L"defines Main: no")) {
K->defines_Main = FALSE;
} else if (Regexp::match(&mr, text, L"natural language: yes")) {
K->supports_inform_language = TRUE;
} else if (Regexp::match(&mr, text, L"natural language: no")) {
K->supports_inform_language = FALSE;
} else if (Regexp::match(&mr, text, L"insert: (%c*)")) {
K->early_source = Str::duplicate(mr.exp[0]);
WRITE_TO(K->early_source, "\n\n");
} else if (Regexp::match(&mr, text, L"priority: (%d*)")) {
else if (Regexp::match(&mr, text, L"compatibility: (%c+)")) @<Add compatibility@>
else if (Regexp::match(&mr, text, L"defines Main: yes")) K->defines_Main = TRUE;
else if (Regexp::match(&mr, text, L"defines Main: no")) K->defines_Main = FALSE;
else if (Regexp::match(&mr, text, L"natural language: yes")) K->supports_nl = TRUE;
else if (Regexp::match(&mr, text, L"natural language: no")) K->supports_nl = FALSE;
else if (Regexp::match(&mr, text, L"insert: (%c*)")) @<Add early source@>
else if (Regexp::match(&mr, text, L"priority: (%d*)"))
K->priority = Str::atoi(mr.exp[0], 0);
} else if (Regexp::match(&mr, text, L"kinds: (%C+)")) {
else if (Regexp::match(&mr, text, L"kinds: (%C+)"))
ADD_TO_LINKED_LIST(Str::duplicate(mr.exp[0]), text_stream, K->kind_definitions);
} else if (Regexp::match(&mr, text, L"extension: (%c+) by (%c+)")) {
inbuild_work *work = Works::new(extension_genre, mr.exp[0], mr.exp[1]);
inbuild_requirement *req = Requirements::any_version_of(work);
ADD_TO_LINKED_LIST(req, inbuild_requirement, K->extensions);
} else if (Regexp::match(&mr, text, L"activate: (%c+)")) {
else if (Regexp::match(&mr, text, L"extension: version (%c+?) of (%c+) by (%c+)"))
@<Add versioned extension@>
else if (Regexp::match(&mr, text, L"extension: (%c+) by (%c+)"))
@<Add unversioned extension@>
else if (Regexp::match(&mr, text, L"activate: (%c+)"))
Kits::activation(K, mr.exp[0], TRUE);
} else if (Regexp::match(&mr, text, L"deactivate: (%c+)")) {
else if (Regexp::match(&mr, text, L"deactivate: (%c+)"))
Kits::activation(K, mr.exp[0], FALSE);
} else if (Regexp::match(&mr, text, L"dependency: if (%C+) then (%C+)")) {
else if (Regexp::match(&mr, text, L"dependency: if (%C+) then (%C+)"))
Kits::dependency(K, mr.exp[0], TRUE, mr.exp[1]);
} else if (Regexp::match(&mr, text, L"dependency: if not (%C+) then (%C+)")) {
else if (Regexp::match(&mr, text, L"dependency: if not (%C+) then (%C+)"))
Kits::dependency(K, mr.exp[0], FALSE, mr.exp[1]);
} else if (Regexp::match(&mr, text, L"index from: (%c*)")) {
K->index_template = Str::duplicate(mr.exp[0]);
} else {
else if (Regexp::match(&mr, text, L"index from: (%c*)"))
K->index_structure = Str::duplicate(mr.exp[0]);
else {
TEMPORARY_TEXT(err);
WRITE_TO(err, "unreadable instruction '%S'", text);
Copies::attach_error(C, CopyErrors::new_T(KIT_MISWORDED_CE, -1, err));
@ -112,15 +119,43 @@ void Kits::read_metadata(text_stream *text, text_file_position *tfp, void *state
Regexp::dispose_of(&mr);
}
inform_kit *Kits::load(text_stream *name, linked_list *nest_list) {
inbuild_requirement *req =
Requirements::any_version_of(Works::new(kit_genre, name, I""));
inbuild_search_result *R = Nests::search_for_best(req, nest_list);
if (R == NULL) Errors::fatal_with_text("cannot find kit", name);
inbuild_copy *C = R->copy;
return KitManager::from_copy(C);
}
@<Add compatibility@> =
compatibility_specification *CS = Compatibility::from_text(mr.exp[0]);
if (CS) C->edition->compatibility = CS;
else {
TEMPORARY_TEXT(err);
WRITE_TO(err, "cannot read compatibility '%S'", mr.exp[0]);
Copies::attach_error(C, CopyErrors::new_T(KIT_MISWORDED_CE, -1, err));
DISCARD_TEXT(err);
}
@<Add early source@> =
K->early_source = Str::duplicate(mr.exp[0]);
WRITE_TO(K->early_source, "\n\n");
@<Add versioned extension@> =
inbuild_work *work = Works::new(extension_genre, mr.exp[1], mr.exp[2]);
semantic_version_number V = VersionNumbers::from_text(mr.exp[0]);
if (VersionNumbers::is_null(V)) {
TEMPORARY_TEXT(err);
WRITE_TO(err, "cannot read version number '%S'", mr.exp[0]);
Copies::attach_error(C, CopyErrors::new_T(KIT_MISWORDED_CE, -1, err));
DISCARD_TEXT(err);
} else {
inbuild_requirement *req = Requirements::new(work,
VersionNumberRanges::compatibility_range(V));
ADD_TO_LINKED_LIST(req, inbuild_requirement, K->extensions);
}
@<Add unversioned extension@> =
inbuild_work *work = Works::new(extension_genre, mr.exp[0], mr.exp[1]);
inbuild_requirement *req = Requirements::any_version_of(work);
ADD_TO_LINKED_LIST(req, inbuild_requirement, K->extensions);
@ We provide if this then that, where |inc| is true, and if this then not that,
where it's false.
=
void Kits::dependency(inform_kit *K, text_stream *if_text, int inc, text_stream *then_text) {
inform_kit_ittt *ITTT = CREATE(inform_kit_ittt);
ITTT->if_name = Str::duplicate(if_text);
@ -129,6 +164,10 @@ void Kits::dependency(inform_kit *K, text_stream *if_text, int inc, text_stream
ADD_TO_LINKED_LIST(ITTT, inform_kit_ittt, K->ittt);
}
@ Language elements can similarly be activated or deactivated, though the
latter may not be useful in practice:
=
void Kits::activation(inform_kit *K, text_stream *name, int act) {
element_activation *EA = CREATE(element_activation);
EA->element_name = Str::duplicate(name);
@ -136,6 +175,26 @@ void Kits::activation(inform_kit *K, text_stream *name, int act) {
ADD_TO_LINKED_LIST(EA, element_activation, K->activations);
}
@h The kits included by a project.
A project can call this to obtain the |inform_kit| structure for the copy of
a kit, going only on a name such as |BasicInformKit|:
=
inform_kit *Kits::find_by_name(text_stream *name, linked_list *nest_list) {
inbuild_requirement *req =
Requirements::any_version_of(Works::new(kit_genre, name, I""));
inbuild_search_result *R = Nests::search_for_best(req, nest_list);
if (R == NULL) Errors::fatal_with_text("cannot find kit", name);
inbuild_copy *C = R->copy;
return KitManager::from_copy(C);
}
@ The ITTT process for a project calls this to see if the ITTT rules for
a |K| require further kit dependencies to be added to the project: if they
do, then the dependencies are added and we return |TRUE|. If there was
nothing to do, we return |FALSE|.
=
int Kits::perform_ittt(inform_kit *K, inform_project *project, int parity) {
int changes_made = FALSE;
inform_kit_ittt *ITTT;
@ -149,6 +208,13 @@ int Kits::perform_ittt(inform_kit *K, inform_project *project, int parity) {
return changes_made;
}
@h Kind definitions.
The base kinds for the Inform language, such as "real number" or "text", are
not defined in high-level source text, nor by Inter, but by special configuration
files held in the |kinds| subdirectory of the kits used. The following function
loads the base kinds in a kit |K|:
=
#ifdef CORE_MODULE
void Kits::load_types(inform_kit *K) {
text_stream *segment;
@ -161,15 +227,23 @@ void Kits::load_types(inform_kit *K) {
}
#endif
@h Language element activation.
Note that this function is meaningful only when this module is part of the
|inform7| executable, and it invites us to activate or deactivate language
features as |K| would like.
=
#ifdef CORE_MODULE
void Kits::activate_plugins(inform_kit *K) {
void Kits::activate_elements(inform_kit *K) {
element_activation *EA;
LOOP_OVER_LINKED_LIST(EA, element_activation, K->activations) {
int S = Plugins::Manage::parse(EA->element_name);
if (S == -1)
Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable),
"one of the Inform kits made reference to a language segment which does not exist",
"which strongly suggests that Inform is not properly installed.");
"one of the Inform kits made reference to a language segment "
"which does not exist",
"which suggests that Inform is not properly installed, unless "
"you are experimenting with new kits.");
if (S >= 0) {
if (EA->activate) Plugins::Manage::activate(S);
else Plugins::Manage::deactivate(S);
@ -178,10 +252,27 @@ void Kits::activate_plugins(inform_kit *K) {
}
#endif
@h Early source.
As we have seen, kits can ask for extensions to be included.
As a last resort, a kit can also ask for a sentence or two to be mandatorily
included in the source text for any project using it. This text appears very
early on, and can't do much, but could for example set use options.
This function simply writes out such sentences, so that they can be fed
into the lexer by our caller.
=
void Kits::early_source_text(OUTPUT_STREAM, inform_kit *K) {
inbuild_requirement *req;
LOOP_OVER_LINKED_LIST(req, inbuild_requirement, K->extensions)
WRITE("Include %S by %S.\n\n", req->work->title, req->work->author_name);
LOOP_OVER_LINKED_LIST(req, inbuild_requirement, K->extensions) {
WRITE("Include ");
if (VersionNumberRanges::is_any_range(req->version_range) == FALSE) {
semantic_version_number V = req->version_range->lower.end_value;
WRITE("version %v of ", &V);
}
WRITE("%S by %S.\n\n", req->work->title, req->work->author_name);
}
if (K->early_source) WRITE("%S\n\n", K->early_source);
}
@ -194,19 +285,39 @@ linked_list *Kits::inter_paths(void) {
return inter_paths;
}
@ The build graph for a kit is quite extensive, since a kit contains Inter
@h Build graph.
The build graph for a kit is quite extensive, since a kit contains Inter
binaries for four different architectures; and each of those has a
dependency on every section file of the web of Inform 6 source for the kit.
If there are $S$ sections then the graph has $S+5$ vertices and $4(S+1)$ edges.
Note that ITTT rules do not affect the build graph; they affect only how a
project uses the kit, and therefore they affect the project's build graph but
not ours.
=
void Kits::construct_graph(inform_kit *K) {
RUN_ONLY_IN_PHASE(GRAPH_CONSTRUCTION_INBUILD_PHASE)
if (K == NULL) return;
inbuild_copy *C = K->as_copy;
pathname *P = C->location_if_path;
build_vertex *KV = C->vertex;
linked_list *BVL = NEW_LINKED_LIST(build_vertex);
build_vertex *KV = C->vertex; /* the kit vertex */
linked_list *BVL = NEW_LINKED_LIST(build_vertex); /* list of vertices for the binaries */
@<Add build edges to the binaries for each architecture@>;
filename *contents_page = Filenames::in_folder(C->location_if_path, I"Contents.w");
build_vertex *CV = Graphs::file_vertex(contents_page); /* the contents page vertex */
@<Add build edges from the binary vertices to the contents vertex@>;
linked_list *L = Kits::find_sections(contents_page);
@<Add build edges from the binary vertices to each section vertex@>;
inbuild_requirement *req;
LOOP_OVER_LINKED_LIST(req, inbuild_requirement, K->extensions)
@<Add use edges from the kit vertex to each extension it asks to include@>;
}
@<Add build edges to the binaries for each architecture@> =
inter_architecture *A;
LOOP_OVER(A, inter_architecture) {
build_vertex *BV = Graphs::file_vertex(Architectures::canonical_binary(P, A));
@ -216,18 +327,14 @@ void Kits::construct_graph(inform_kit *K) {
ADD_TO_LINKED_LIST(BV, build_vertex, BVL);
}
filename *contents_page = Filenames::in_folder(C->location_if_path, I"Contents.w");
build_vertex *CV = Graphs::file_vertex(contents_page);
@<Add build edges from the binary vertices to the contents vertex@> =
build_vertex *BV;
LOOP_OVER_LINKED_LIST(BV, build_vertex, BVL)
Graphs::need_this_to_build(BV, CV);
kit_contents_section_state CSS;
CSS.active = FALSE;
CSS.sects = NEW_LINKED_LIST(text_stream);
TextFiles::read(contents_page, FALSE, NULL, FALSE, Kits::read_contents, NULL, (void *) &CSS);
@<Add build edges from the binary vertices to each section vertex@> =
text_stream *segment;
LOOP_OVER_LINKED_LIST(segment, text_stream, CSS.sects) {
LOOP_OVER_LINKED_LIST(segment, text_stream, L) {
filename *SF = Filenames::in_folder(
Pathnames::subfolder(C->location_if_path, I"Sections"), segment);
build_vertex *SV = Graphs::file_vertex(SF);
@ -236,21 +343,32 @@ void Kits::construct_graph(inform_kit *K) {
Graphs::need_this_to_build(BV, SV);
}
inbuild_requirement *req;
LOOP_OVER_LINKED_LIST(req, inbuild_requirement, K->extensions) {
int found = FALSE;
inform_extension *E;
LOOP_OVER(E, inform_extension)
if (Requirements::meets(E->as_copy->edition, req)) {
Graphs::need_this_to_use(KV, E->as_copy->vertex);
found = TRUE;
break;
}
if (found == FALSE) {
build_vertex *RV = Graphs::req_vertex(req);
Graphs::need_this_to_use(KV, RV);
@ Suppose our kit wants to include Locksmith by Emily Short. If that's an
extension we have already read in, we can place a use edge to its existing
build vertex. If not, the best we can do is a use edge to a requirement
vertex, i.e., to a vertex meaning "we would like Locksmith but can't find it".
@<Add use edges from the kit vertex to each extension it asks to include@> =
int found = FALSE;
inform_extension *E;
LOOP_OVER(E, inform_extension)
if (Requirements::meets(E->as_copy->edition, req)) {
Graphs::need_this_to_use(KV, E->as_copy->vertex);
found = TRUE;
break;
}
if (found == FALSE) {
build_vertex *RV = Graphs::req_vertex(req);
Graphs::need_this_to_use(KV, RV);
}
@ =
linked_list *Kits::find_sections(filename *contents_page) {
kit_contents_section_state CSS;
CSS.active = FALSE;
CSS.sects = NEW_LINKED_LIST(text_stream);
TextFiles::read(contents_page, FALSE, NULL, FALSE, Kits::read_contents, NULL, (void *) &CSS);
return CSS.sects;
}
typedef struct kit_contents_section_state {

View file

@ -133,7 +133,7 @@ void Projects::add_kit_dependency(inform_project *project, text_stream *kit_name
RUN_ONLY_BEFORE_PHASE(OPERATIONAL_INBUILD_PHASE)
if (Projects::uses_kit(project, kit_name)) return;
kit_dependency *kd = CREATE(kit_dependency);
kd->kit = Kits::load(kit_name, Inbuild::nest_list());
kd->kit = Kits::find_by_name(kit_name, Inbuild::nest_list());
kd->because_of_language = because_of_language;
kd->because_of_kit = because_of_kit;
ADD_TO_LINKED_LIST(kd, kit_dependency, project->kits_to_include);
@ -195,13 +195,19 @@ void Projects::load_types(inform_project *project) {
}
#endif
@h Language element activation.
Note that this function is meaningful only when this module is part of the
|inform7| executable, and it invites us to activate or deactivate language
features according to what our kits tell us.
=
#ifdef CORE_MODULE
void Projects::activate_plugins(inform_project *project) {
LOG("Activate plugins...\n");
void Projects::activate_elements(inform_project *project) {
LOG("Activate elements...\n");
Plugins::Manage::activate(CORE_PLUGIN_NAME);
kit_dependency *kd;
LOOP_OVER_LINKED_LIST(kd, kit_dependency, project->kits_to_include)
Kits::activate_plugins(kd->kit);
Kits::activate_elements(kd->kit);
Plugins::Manage::show(DL, "Included", TRUE);
Plugins::Manage::show(DL, "Excluded", FALSE);
}
@ -215,12 +221,12 @@ int Projects::Main_defined(inform_project *project) {
return FALSE;
}
text_stream *Projects::index_template(inform_project *project) {
text_stream *Projects::index_structure(inform_project *project) {
text_stream *I = NULL;
kit_dependency *kd;
LOOP_OVER_LINKED_LIST(kd, kit_dependency, project->kits_to_include)
if (kd->kit->index_template)
I = kd->kit->index_template;
if (kd->kit->index_structure)
I = kd->kit->index_structure;
return I;
}
@ -400,7 +406,7 @@ void Projects::read_source_text_for(inform_project *project) {
ParseTree::push_attachment_point(project->syntax_tree, implicit_heading);
#ifdef CORE_MODULE
Projects::activate_plugins(project);
Projects::activate_elements(project);
#endif
Inclusions::traverse(project->as_copy, project->syntax_tree);
Headings::satisfy_dependencies(project->syntax_tree, project->as_copy);

View file

@ -57,7 +57,7 @@ is run only to call other functions.
=
void I6T::interpreter_shared(parse_node_tree *T, int int_mode, OUTPUT_STREAM, wchar_t *sf, text_stream *segment_name,
int N_escape, filename *index_template) {
int N_escape, filename *index_structure) {
FILE *Input_File = NULL;
int col = 1, cr, sfp = 0;
TEMPORARY_TEXT(heading_name);
@ -133,10 +133,10 @@ file.
Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */
"I couldn't open a requested I6T segment: see the console "
"output for details.");
} else if (index_template) {
Input_File = Filenames::fopen(index_template, "r");
} else if (index_structure) {
Input_File = Filenames::fopen(index_structure, "r");
if (Input_File == NULL) {
LOG("Filename was %f\n", index_template);
LOG("Filename was %f\n", index_structure);
Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */
"I couldn't open the template file for the index.");
}

View file

@ -12,7 +12,7 @@ void NaturalLanguages::produce_index(void) {
Filenames::in_folder(
Languages::path_to_bundle(
Projects::get_language_of_index(project)),
Projects::index_template(project)));
Projects::index_structure(project)));
}
@