mirror of
https://github.com/ganelson/inform.git
synced 2024-06-29 05:24:57 +03:00
Continued redrafting of inbuild module
This commit is contained in:
parent
b044dc53dd
commit
567950cce4
|
@ -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
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: alpha.1
|
||||
Build Date: 31 March 2020
|
||||
Build Number: 6Q32
|
||||
Build Date: 1 April 2020
|
||||
Build Number: 6Q33
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§2</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/bs (<a href="1-bs.html#SP2">§2</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">§12</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 3/rls (<a href="3-rls.html#SP12">§12</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Make the default settings</span> <span class="cwebmacronumber">3.1</span>> =
|
||||
|
|
|
@ -756,11 +756,11 @@ are given precedence over those in the external folder, and so on.
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">§9.2</a>, 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>, <a href="5-kts.html#SP2">§2</a>), 5/ps2 (<a href="5-ps2.html#SP1">§1</a>, <a href="5-ps2.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">§4</a>), 7/ec (<a href="7-ec.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">§9.2</a>, 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP12">§12</a>, <a href="5-kts.html#SP13_1">§13.1</a>), 5/ps2 (<a href="5-ps2.html#SP1">§1</a>, <a href="5-ps2.html#SP4">§4</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">§4</a>), 7/ec (<a href="7-ec.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inbuild::internal is used in <a href="#SP23">§23</a>, 5/ls (<a href="5-ls.html#SP7">§7</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inbuild::external is used in 5/ps2 (<a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
<p class="endnote">The function Inbuild::external is used in 5/ps2 (<a href="5-ps2.html#SP5">§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">§3</a>), 7/ed (<a href="7-ed.html#SP11">§11</a>), 7/ed2 (<a href="7-ed2.html#SP3">§3</a>), 7/ec (<a href="7-ec.html#SP15">§15</a>).</p>
|
||||
<p class="endnote">The function Inbuild::transient is used in 5/ps2 (<a href="5-ps2.html#SP4">§4</a>), 7/ed (<a href="7-ed.html#SP11">§11</a>), 7/ed2 (<a href="7-ed2.html#SP3">§3</a>), 7/ec (<a href="7-ec.html#SP15">§15</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP17"></a><b>§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
|
||||
|
|
|
@ -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">§6</a>), 6/st (<a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP24_1">§24.1</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
<p class="endnote">The function CopyErrors::new is used in 5/ps2 (<a href="5-ps2.html#SP7">§7</a>), 6/st (<a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP24_1">§24.1</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
|
||||
<p class="endnote">The function CopyErrors::new_T is used in 5/es (<a href="5-es.html#SP2_2">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 6/hdn (<a href="6-hdn.html#SP23_2">§23.2</a>), 6/inc (<a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§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">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP5">§5</a>, <a href="5-kts.html#SP5_1">§5.1</a>, <a href="5-kts.html#SP5_3">§5.3</a>), 6/hdn (<a href="6-hdn.html#SP23_2">§23.2</a>), 6/inc (<a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§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">§2.3</a>), 6/st (<a href="6-st.html#SP4">§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">§24.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CopyErrors::supply_node is used in 5/ps2 (<a href="5-ps2.html#SP6">§6</a>), 6/st (<a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP23_2">§23.2</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
<p class="endnote">The function CopyErrors::supply_node is used in 5/ps2 (<a href="5-ps2.html#SP7">§7</a>), 6/st (<a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP23_2">§23.2</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
|
||||
<p class="endnote">The function CopyErrors::supply_nodes is used in 6/hdn (<a href="6-hdn.html#SP24_1">§24.1</a>).</p>
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ additional data specific to your genre:
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">The function Copies::set_content is used in 4/lm (<a href="4-lm.html#SP3">§3</a>), 4/pm (<a href="4-pm.html#SP3">§3</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/es (<a href="5-es.html#SP2">§2</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Copies::set_content is used in 4/lm (<a href="4-lm.html#SP3">§3</a>), 4/pm (<a href="4-pm.html#SP3">§3</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/es (<a href="5-es.html#SP2">§2</a>), 5/kts (<a href="5-kts.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ps2 (<a href="5-ps2.html#SP6">§6</a>), 6/st (<a href="6-st.html#SP1">§1</a>, <a href="6-st.html#SP2">§2</a>, <a href="6-st.html#SP4">§4</a>, <a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP24_1">§24.1</a>, <a href="6-hdn.html#SP23_2">§23.2</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
<p class="endnote">The function Copies::attach_error is used in 5/es (<a href="5-es.html#SP2_2">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP5">§5</a>, <a href="5-kts.html#SP5_1">§5.1</a>, <a href="5-kts.html#SP5_3">§5.3</a>), 5/ps2 (<a href="5-ps2.html#SP7">§7</a>), 6/st (<a href="6-st.html#SP1">§1</a>, <a href="6-st.html#SP2">§2</a>, <a href="6-st.html#SP4">§4</a>, <a href="6-st.html#SP12">§12</a>), 6/hdn (<a href="6-hdn.html#SP13_1">§13.1</a>, <a href="6-hdn.html#SP13_2">§13.2</a>, <a href="6-hdn.html#SP23_1">§23.1</a>, <a href="6-hdn.html#SP24_1">§24.1</a>, <a href="6-hdn.html#SP23_2">§23.2</a>, <a href="6-hdn.html#SP23_3">§23.3</a>), 6/inc (<a href="6-inc.html#SP3_1">§3.1</a>, <a href="6-inc.html#SP6_1_1">§6.1.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>, <a href="6-inc.html#SP7_1">§7.1</a>, <a href="6-inc.html#SP9_1">§9.1</a>, <a href="6-inc.html#SP11">§11</a>).</p>
|
||||
|
||||
<p class="endnote">The function Copies::list_attached_errors is used in <a href="#SP9">§9</a>, 5/ps2 (<a href="5-ps2.html#SP4">§4</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
<p class="endnote">The function Copies::list_attached_errors is used in <a href="#SP9">§9</a>, 5/ps2 (<a href="5-ps2.html#SP5">§5</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Writing. </b></p>
|
||||
|
||||
|
|
|
@ -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">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
<p class="endnote">The function Nests::search_for_best is used in 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP8">§8</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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
|
||||
|
|
|
@ -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">§5.1</a>).</p>
|
||||
<p class="endnote">The function Requirements::new is used in 5/kts (<a href="5-kts.html#SP5_3">§5.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">§6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">§4</a>).</p>
|
||||
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP5_4">§5.4</a>, <a href="5-kts.html#SP8">§8</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">§6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="endnote">The function Requirements::anything_of_genre is used in 1/ic (<a href="1-ic.html#SP9_2">§9.2</a>), 7/ec (<a href="7-ec.html#SP3">§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">§6</a>), 4/km (<a href="4-km.html#SP5">§5</a>), 4/lm (<a href="4-lm.html#SP5">§5</a>), 4/pm (<a href="4-pm.html#SP5">§5</a>), 4/tm (<a href="4-tm.html#SP5">§5</a>), 5/es (<a href="5-es.html#SP7">§7</a>), 5/kts (<a href="5-kts.html#SP2">§2</a>), 6/inc (<a href="6-inc.html#SP6">§6</a>), 7/ed2 (<a href="7-ed2.html#SP4">§4</a>).</p>
|
||||
<p class="endnote">The function Requirements::meets is used in 4/em (<a href="4-em.html#SP6">§6</a>), 4/km (<a href="4-km.html#SP5">§5</a>), 4/lm (<a href="4-lm.html#SP5">§5</a>), 4/pm (<a href="4-pm.html#SP5">§5</a>), 4/tm (<a href="4-tm.html#SP5">§5</a>), 5/es (<a href="5-es.html#SP7">§7</a>), 5/kts (<a href="5-kts.html#SP13_4">§13.4</a>), 6/inc (<a href="6-inc.html#SP6">§6</a>), 7/ed2 (<a href="7-ed2.html#SP4">§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">
|
||||
|
|
|
@ -112,7 +112,7 @@ not subsequently altered.
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">The function Works::new is used in <a href="#SP10">§10</a>, 2/rqr (<a href="2-rqr.html#SP2">§2</a>), 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 4/em (<a href="4-em.html#SP4">§4</a>), 4/lm (<a href="4-lm.html#SP3">§3</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/es (<a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">§13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>), 7/ed (<a href="7-ed.html#SP10">§10</a>).</p>
|
||||
<p class="endnote">The function Works::new is used in <a href="#SP10">§10</a>, 2/rqr (<a href="2-rqr.html#SP2">§2</a>), 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 4/em (<a href="4-em.html#SP4">§4</a>), 4/lm (<a href="4-lm.html#SP3">§3</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/es (<a href="5-es.html#SP2_3">§2.3</a>), 5/kts (<a href="5-kts.html#SP5_3">§5.3</a>, <a href="5-kts.html#SP5_4">§5.4</a>, <a href="5-kts.html#SP8">§8</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">§13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>), 7/ed (<a href="7-ed.html#SP10">§10</a>).</p>
|
||||
|
||||
<p class="endnote">The function Works::new_raw is used in 4/km (<a href="4-km.html#SP3">§3</a>), 4/pm (<a href="4-pm.html#SP4">§4</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>, 5/kts (<a href="5-kts.html#SP2">§2</a>), 5/ps2 (<a href="5-ps2.html#SP1">§1</a>, <a href="5-ps2.html#SP3">§3</a>).</p>
|
||||
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">§3</a>, 5/kts (<a href="5-kts.html#SP13">§13</a>, <a href="5-kts.html#SP13_1">§13.1</a>, <a href="5-kts.html#SP13_3">§13.3</a>), 5/ps2 (<a href="5-ps2.html#SP1">§1</a>, <a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP2">§2</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP13_4">§13.4</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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">§2</a>), 5/ps2 (<a href="5-ps2.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP1_1">§1.1</a>, <a href="6-inc.html#SP6_1">§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">§13.1</a>, <a href="5-kts.html#SP13_2">§13.2</a>, <a href="5-kts.html#SP13_3">§13.3</a>), 5/ps2 (<a href="5-ps2.html#SP4">§4</a>), 6/inc (<a href="6-inc.html#SP1_1">§1.1</a>, <a href="6-inc.html#SP6_1">§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">§2</a>), 5/ps2 (<a href="5-ps2.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP1_1">§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">§13.4</a>), 5/ps2 (<a href="5-ps2.html#SP4">§4</a>), 6/inc (<a href="6-inc.html#SP1_1">§1.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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:
|
||||
|
|
|
@ -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">§2</a>), 5/ps2 (<a href="5-ps2.html#SP3">§3</a>).</p>
|
||||
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP13_1">§13.1</a>), 5/ps2 (<a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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
|
||||
|
|
|
@ -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">§5</a>, <a href="#SP6">§6</a>, 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function KitManager::path_within_nest is used in <a href="#SP5">§5</a>, <a href="#SP6">§6</a>, 5/kts (<a href="5-kts.html#SP12">§12</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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">§7</a>, 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function KitManager::from_copy is used in <a href="#SP7">§7</a>, 5/kts (<a href="5-kts.html#SP5">§5</a>, <a href="5-kts.html#SP8">§8</a>).</p>
|
||||
|
||||
<p class="endnote">The function KitManager::new_copy is used in <a href="#SP4">§4</a>.</p>
|
||||
|
||||
|
|
|
@ -59,73 +59,165 @@
|
|||
<!--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">§1. Genre definition</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Scanning metadata</a></li><li><a href="#SP8">§8. The kits included by a project</a></li><li><a href="#SP10">§10. Kind definitions</a></li><li><a href="#SP11">§11. Language element activation</a></li><li><a href="#SP12">§12. Early source</a></li><li><a href="#SP13">§13. Build graph</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Genre definition. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§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>§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>§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">>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">>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">>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">>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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>title</span><span class="plain">);</span>
|
||||
<span class="identifier">K</span><span class="plain">-</span><span class="element">>priority</span><span class="plain"> = 10;</span>
|
||||
|
||||
<span class="identifier">K</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">(&</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">(&</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">(&</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">>edition</span><span class="plain">-</span><span class="element">>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">(&</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="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">(&</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="cwebmacro">Add compatibility</span> <span class="cwebmacronumber">5.1</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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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="cwebmacro">Add early source</span> <span class="cwebmacronumber">5.2</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">(&</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">>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="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">(&</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">>kind_definitions</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">(&</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>
|
||||
<<span class="cwebmacro">Add versioned extension</span> <span class="cwebmacronumber">5.3</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">(&</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="cwebmacro">Add unversioned extension</span> <span class="cwebmacronumber">5.4</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">(&</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="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">(&</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="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">(&</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="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">(&</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="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">(&</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">>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>
|
||||
<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="identifier">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
||||
<span class="plain">}</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">The function Kits::read_metadata is used in <a href="#SP4">§4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add compatibility</span> <span class="cwebmacronumber">5.1</span>> =
|
||||
</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">>edition</span><span class="plain">-</span><span class="element">>compatibility</span><span class="plain"> = </span><span class="identifier">CS</span><span class="plain">;</span>
|
||||
<span class="reserved">else</span><span class="plain"> {</span>
|
||||
|
@ -134,53 +226,71 @@
|
|||
<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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add early source</span> <span class="cwebmacronumber">5.2</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<span class="identifier">K</span><span class="plain">-</span><span class="element">>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">>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">(&</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">>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">(&</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">>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">(&</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>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_3"></a><b>§5.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add versioned extension</span> <span class="cwebmacronumber">5.3</span>> =
|
||||
</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">>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">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_4"></a><b>§5.4. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add unversioned extension</span> <span class="cwebmacronumber">5.4</span>> =
|
||||
</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">>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">(&</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">(&</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">(&</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">(&</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">(&</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">>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="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>
|
||||
<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="identifier">Regexp::dispose_of</span><span class="plain">(&</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">>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">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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">>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">>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">>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">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">>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">>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">>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">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">>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">§1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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">§1.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§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">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP11"></a><b>§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">>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">>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"> >= 0) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">>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">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP12"></a><b>§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">>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">>work</span><span class="plain">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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">>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">>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">>version_range</span><span class="plain">-></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">, &</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">>work</span><span class="plain">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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">>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">>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">§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">§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">§1.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::load_types is used in 5/ps2 (<a href="5-ps2.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::activate_plugins is used in 5/ps2 (<a href="5-ps2.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::early_source_text is used in 5/ps2 (<a href="5-ps2.html#SP3">§3</a>).</p>
|
||||
<p class="endnote">The function Kits::early_source_text is used in 5/ps2 (<a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP4">§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>§2. </b>The build graph for a kit is quite extensive, since a kit contains Inter
|
||||
<p class="inwebparagraph"><a id="SP13"></a><b>§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">>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">>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">>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">>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>
|
||||
<<span class="cwebmacro">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</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="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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>
|
||||
<<span class="cwebmacro">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>><span class="plain">;</span>
|
||||
|
||||
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Kits::find_sections</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">);</span>
|
||||
<<span class="cwebmacro">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</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">>extensions</span><span class="plain">)</span>
|
||||
<<span class="cwebmacro">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>><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">§7</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP13_1"></a><b>§13.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</span>> =
|
||||
</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">>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">>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">§13</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP13_2"></a><b>§13.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>> =
|
||||
</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"> *) &</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">§13</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP13_3"></a><b>§13.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</span>> =
|
||||
</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">>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,9 +556,25 @@ 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">>extensions</span><span class="plain">) {</span>
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP13_4"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>> =
|
||||
</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>
|
||||
|
@ -341,7 +587,22 @@ If there are S sections then the graph has S+5 vertices and 4(S+1) edges.
|
|||
<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>
|
||||
<span class="plain">}</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP14"></a><b>§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"> *) &</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">§7</a>).</p>
|
||||
<p class="endnote">The function Kits::find_sections is used in <a href="#SP13">§13</a>.</p>
|
||||
|
||||
<p class="endnote">The function Kits::read_contents appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3. Language element activation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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">>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">>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">>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">§9.2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Projects::set_language_of_play is used in <a href="#SP6">§6</a>.</p>
|
||||
<p class="endnote">The function Projects::set_language_of_play is used in <a href="#SP7">§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">§3</a>.</p>
|
||||
<p class="endnote">The function Projects::path is used in <a href="#SP4">§4</a>.</p>
|
||||
|
||||
<p class="endnote">The function Projects::source is used in <a href="#SP4">§4</a>, <a href="#SP7">§7</a>.</p>
|
||||
<p class="endnote">The function Projects::source is used in <a href="#SP5">§5</a>, <a href="#SP8">§8</a>.</p>
|
||||
|
||||
<p class="endnote">The function Projects::add_kit_dependency is used in 1/ic (<a href="1-ic.html#SP22">§22</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Projects::add_kit_dependency is used in 1/ic (<a href="1-ic.html#SP22">§22</a>), 5/kts (<a href="5-kts.html#SP9">§9</a>).</p>
|
||||
|
||||
<p class="endnote">The function Projects::uses_kit is used in 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Projects::uses_kit is used in 5/kts (<a href="5-kts.html#SP9">§9</a>).</p>
|
||||
|
||||
<p class="endnote">The function Projects::finalise_kit_dependencies is used in <a href="#SP4">§4</a>.</p>
|
||||
<p class="endnote">The function Projects::finalise_kit_dependencies is used in <a href="#SP5">§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">>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>§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">>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">>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">>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">>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">>kit</span><span class="plain">-</span><span class="element">>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">>kit</span><span class="plain">-</span><span class="element">>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">>kit</span><span class="plain">-</span><span class="element">>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">>kit</span><span class="plain">-</span><span class="element">>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">§4</a>.</p>
|
||||
<p class="endnote">The function Projects::activate_elements is used in <a href="#SP5">§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>§3. </b>Every source text read into Inform is automatically prefixed by a few words
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Every source text read into Inform is automatically prefixed by a few words
|
||||
loading the fundamental "extensions" — 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">§4</a>.</p>
|
||||
<p class="endnote">The function Projects::early_source_text is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP4">§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">§6</a>), 4/pfm (<a href="4-pfm.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">>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">>as_copy</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">>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">>syntax_tree</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">>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">§7</a>), 4/pfm (<a href="4-pfm.html#SP7">§7</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>It might seem sensible to parse the opening sentence of the source text,
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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>§6. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">>as_copy</span><span class="plain">-</span><span class="element">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>title</span><span class="plain">);</span>
|
||||
<span class="plain">}</span>
|
||||
<<span class="cwebmacro">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Extract title and author name wording</span> <span class="cwebmacronumber">7.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">7.3</span>><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>§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>§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>§6.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Extract title and author name wording</span> <span class="cwebmacronumber">6.2</span>> =
|
||||
<p class="inwebparagraph"><a id="SP7_2"></a><b>§7.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Extract title and author name wording</span> <span class="cwebmacronumber">7.2</span>> =
|
||||
</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">§6</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3"></a><b>§6.3. </b>The author is sometimes given outside of quotation marks:
|
||||
<p class="inwebparagraph"><a id="SP7_3"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">6.3</span>> =
|
||||
<<span class="cwebmacrodefn">Dequote the title and, perhaps, author name</span> <span class="cwebmacronumber">7.3</span>> =
|
||||
</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">§6</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>When Inform reads the (optional!) Options file, very early in its run, it
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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 — earlier even than
|
||||
<structural-sentence>. 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 — 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">§4</a>.</p>
|
||||
<p class="endnote">The function Projects::read_further_mandatory_text is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="endnote">The function Projects::read_further_mandatory_text_helper appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§4</a>).</p>
|
||||
<p class="endnote">The function Headings::declare is used in 5/ps2 (<a href="5-ps2.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP11_1"></a><b>§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">§4</a>).</p>
|
||||
<p class="endnote">The function Headings::satisfy_dependencies is used in 5/ps2 (<a href="5-ps2.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP23"></a><b>§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
|
||||
|
|
|
@ -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">§8</a>), 5/ps2 (<a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
<p class="endnote">The function Inclusions::traverse is used in 4/em (<a href="4-em.html#SP8">§8</a>), 5/ps2 (<a href="5-ps2.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inclusions::spawned_from_vertex is used in <a href="#SP1_1">§1.1</a>, <a href="#SP6_1">§6.1</a>.</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>), 5/ps2 (<a href="5-ps2.html#SP4">§4</a>).</p>
|
||||
<p class="endnote">The function SourceText::read_file is used in 5/es (<a href="5-es.html#SP3">§3</a>), 5/ps2 (<a href="5-ps2.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b>This is where messages like
|
||||
</p>
|
||||
|
|
|
@ -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">§23</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 6/st (<a href="6-st.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/ic (<a href="1-ic.html#SP23">§23</a>), 5/kts (<a href="5-kts.html#SP4">§4</a>), 6/st (<a href="6-st.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">2.1</span>> =
|
||||
|
|
|
@ -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">§24</a>), 3/cai (<a href="3-cai.html#SP9_1">§9.1</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 2/haj (<a href="2-haj.html#SP24">§24</a>), 3/cai (<a href="3-cai.html#SP9_1">§9.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. Starting up. </b></p>
|
||||
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/ic (<a href="1-ic.html#SP23">§23</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 6/st (<a href="6-st.html#SP1">§1</a>), 4/am (<a href="4-am.html#SP25_1">§25.1</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 22/ph (<a href="22-ph.html#SP4">§4</a>), 22/pu (<a href="22-pu.html#SP3">§3</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/bs (<a href="1-bs.html#SP2">§2</a>), 3/fc (<a href="3-fc.html#SP1">§1</a>), 3/sm (<a href="3-sm.html#SP36">§36</a>, <a href="3-sm.html#SP36_1">§36.1</a>, <a href="3-sm.html#SP38">§38</a>), 3/em2 (<a href="3-em2.html#SP24">§24</a>), 4/ap (<a href="4-ap.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/ic (<a href="1-ic.html#SP23">§23</a>), 5/kts (<a href="5-kts.html#SP4">§4</a>), 6/st (<a href="6-st.html#SP1">§1</a>), 4/am (<a href="4-am.html#SP25_1">§25.1</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 22/ph (<a href="22-ph.html#SP4">§4</a>), 22/pu (<a href="22-pu.html#SP3">§3</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/bs (<a href="1-bs.html#SP2">§2</a>), 3/fc (<a href="3-fc.html#SP1">§1</a>), 3/sm (<a href="3-sm.html#SP36">§36</a>, <a href="3-sm.html#SP36_1">§36.1</a>, <a href="3-sm.html#SP38">§38</a>), 3/em2 (<a href="3-em2.html#SP24">§24</a>), 4/ap (<a href="4-ap.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::deputy appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::disallow appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b>We use Foundation to read the command line:
|
||||
</p>
|
||||
|
|
|
@ -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">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/bs (<a href="1-bs.html#SP2">§2</a>), 3/fc (<a href="3-fc.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/bs (<a href="1-bs.html#SP2">§2</a>), 3/fc (<a href="3-fc.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">2.1</span>> =
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3.1</a>).</p>
|
||||
<p class="endnote">The function main is used in 8/wm (<a href="8-wm.html#SP3">§3</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Main::respond appears nowhere else.</p>
|
||||
|
||||
|
|
|
@ -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,8 +343,12 @@ 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) {
|
||||
@ 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)
|
||||
|
@ -250,7 +361,14 @@ void Kits::construct_graph(inform_kit *K) {
|
|||
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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
|
||||
@
|
||||
|
|
Loading…
Reference in a new issue