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

641 lines
81 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-03-31 02:17:21 +03:00
<title>5/es</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2020-02-27 13:18:25 +02:00
<!--Weave of '5/kts' generated by 7-->
2020-03-31 02:17:21 +03:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#5">Chapter 5: Genre Services</a></li><li><b>Kits</b></li></ul><p class="purpose">Behaviour specific to copies of the kit genre.</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<ul class="toc"><li><a href="#SP1">&#167;1. Scanning metadata</a></li><li><a href="#SP8">&#167;8. The kits included by a project</a></li><li><a href="#SP10">&#167;10. Kind definitions</a></li><li><a href="#SP11">&#167;11. Language element activation</a></li><li><a href="#SP12">&#167;12. Early source</a></li><li><a href="#SP13">&#167;13. Build graph</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Scanning metadata. </b>Metadata for kits is stored in the following structure. "Attachment" for a
kit is the process of taking the Inter code from a binary Inter file in the
kit directory and merging it into code already generated by the <code class="display"><span class="extract">core</span></code>
module of <code class="display"><span class="extract">inform7</span></code>.
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_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>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_kit</span><span class="plain">;</span>
2020-04-01 22:43:13 +03:00
</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>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Kits come with an "if this then that" service for including other kits,
and we represent rules with the following:
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="endnote">The structure inform_kit_ittt is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Kits can also enable elements of the Inform programming language: that is,
enable compiler support for them. For example, the WorldModelKit enables
interactive fiction features of the compiler, but BasicInformKit does not.
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">The structure element_activation is private to this section.</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Here goes, then:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::scan</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<span class="functiontext">Copies::set_content</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">STORE_POINTER_inform_kit</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
2020-04-01 22:43:13 +03:00
2020-02-27 13:18:25 +02:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
2020-04-01 22:43:13 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">, </span><span class="string">"/main/%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = 10;</span>
2020-04-01 22:43:13 +03:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
2020-04-01 22:43:13 +03:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_structure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-01 22:43:13 +03:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="functiontext">Kits::read_metadata</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::scan is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The following reads line by line through the <code class="display"><span class="extract">kit_metadata.txt</span></code> file:
</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::read_metadata</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = (</span><span class="reserved">inbuild_copy</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) || (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *#%c*"</span><span class="plain">))) {</span>
<span class="plain">;</span>
2020-04-01 22:43:13 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"version: (%C+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="identifier">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"compatibility: (%c+)"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Add compatibility</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: yes"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: no"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: yes"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: no"</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_nl</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"insert: (%c*)"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Add early source</span> <span class="cwebmacronumber">5.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"priority: (%d*)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], 0);</span>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"kinds: (%C+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain">);</span>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: version (%c+?) of (%c+) by (%c+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Add versioned extension</span> <span class="cwebmacronumber">5.3</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: (%c+) by (%c+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Add unversioned extension</span> <span class="cwebmacronumber">5.4</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"activate: (%c+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"deactivate: (%c+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if (%C+) then (%C+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if not (%C+) then (%C+)"</span><span class="plain">))</span>
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"index from: (%c*)"</span><span class="plain">))</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_structure</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">else</span><span class="plain"> {</span>
2020-02-27 13:18:25 +02:00
<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>
2020-03-29 19:39:17 +03:00
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">KIT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::read_metadata is used in <a href="#SP4">&#167;4</a>.</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add compatibility</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">compatibility_specification</span><span class="plain"> *</span><span class="identifier">CS</span><span class="plain"> = </span><span class="identifier">Compatibility::from_text</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CS</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;compatibility</span><span class="plain"> = </span><span class="identifier">CS</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"cannot read compatibility '%S'"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">KIT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add early source</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add versioned extension</span> <span class="cwebmacronumber">5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[2]);</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"cannot read version number '%S'"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="functiontext">Copies::attach_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">CopyErrors::new_T</span><span class="plain">(</span><span class="constant">KIT_MISWORDED_CE</span><span class="plain">, -1, </span><span class="identifier">err</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="functiontext">Requirements::new</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">,</span>
<span class="identifier">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">));</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_4"></a><b>&#167;5.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add unversioned extension</span> <span class="cwebmacronumber">5.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We provide if this then that, where <code class="display"><span class="extract">inc</span></code> is true, and if this then not that,
where it's false.
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">if_text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">inc</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">then_text</span><span class="plain">) {</span>
<span class="reserved">inform_kit_ittt</span><span class="plain"> *</span><span class="identifier">ITTT</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">if_text</span><span class="plain">);</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_included</span><span class="plain"> = </span><span class="identifier">inc</span><span class="plain">;</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">then_text</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">, </span><span class="reserved">inform_kit_ittt</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::dependency is used in <a href="#SP5">&#167;5</a>.</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Language elements can similarly be activated or deactivated, though the
latter may not be useful in practice:
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">act</span><span class="plain">) {</span>
<span class="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain"> = </span><span class="identifier">act</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::activation is used in <a href="#SP5">&#167;5</a>.</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. The kits included by a project. </b>A project can call this to obtain the <code class="display"><span class="extract">inform_kit</span></code> structure for the copy of
a kit, going only on a name such as <code class="display"><span class="extract">BasicInformKit</span></code>:
</p>
<pre class="display">
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">Kits::find_by_name</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">nest_list</span><span class="plain">) {</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> =</span>
<span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">));</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">nest_list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Errors::fatal_with_text</span><span class="plain">(</span><span class="string">"cannot find kit"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::find_by_name is used in 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>The ITTT process for a project calls this to see if the ITTT rules for
a <code class="display"><span class="extract">K</span></code> require further kit dependencies to be added to the project: if they
do, then the dependencies are added and we return <code class="display"><span class="extract">TRUE</span></code>. If there was
nothing to do, we return <code class="display"><span class="extract">FALSE</span></code>.
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<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>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">, </span><span class="reserved">inform_kit_ittt</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_included</span><span class="plain"> == </span><span class="identifier">parity</span><span class="plain">) &amp;&amp;</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">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</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">ITTT</span><span class="plain">-</span><span class="element">&gt;if_name</span><span class="plain">) == </span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_included</span><span class="plain">)) {</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">Projects::add_kit_dependency</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">, </span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">changes_made</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Kits::perform_ittt is used in 5/ps2 (<a href="5-ps2.html#SP1_1">&#167;1.1</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Kind definitions. </b>The base kinds for the Inform language, such as "real number" or "text", are
not defined in high-level source text, nor by Inter, but by special configuration
files held in the <code class="display"><span class="extract">kinds</span></code> subdirectory of the kits used. The following function
loads the base kinds in a kit <code class="display"><span class="extract">K</span></code>:
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<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>
<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">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kinds"</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">P</span><span class="plain">, </span><span class="identifier">segment</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Loading kinds definitions from %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">I6T::interpret_kindt</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::load_types is used in 5/ps2 (<a href="5-ps2.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Language element activation. </b>Note that this function is meaningful only when this module is part of the
<code class="display"><span class="extract">inform7</span></code> executable, and it invites us to activate or deactivate language
features as <code class="display"><span class="extract">K</span></code> would like.
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<span class="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Plugins::Manage::parse</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == -1)</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> &gt;= 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain">) </span><span class="identifier">Plugins::Manage::activate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Plugins::Manage::deactivate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::activate_elements is used in 5/ps2 (<a href="5-ps2.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Early source. </b>As we have seen, kits can ask for extensions to be included.
</p>
<p class="inwebparagraph">As a last resort, a kit can also ask for a sentence or two to be mandatorily
included in the source text for any project using it. This text appears very
early on, and can't do much, but could for example set use options.
</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<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">
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Include "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">-&gt;</span><span class="identifier">lower</span><span class="plain">.</span><span class="identifier">end_value</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"version %v of "</span><span class="plain">, &amp;</span><span class="identifier">V</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S by %S.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">);</span>
<span class="plain">}</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Kits::inter_paths</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">inter_paths</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain">);</span>
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">();</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="functiontext">KitManager::path_within_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">), </span><span class="identifier">pathname</span><span class="plain">, </span><span class="identifier">inter_paths</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inter_paths</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Kits::early_source_text is used in 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Build graph. </b>The build graph for a kit is quite extensive, since a kit contains Inter
2020-02-27 13:18:25 +02:00
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>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<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>
2020-03-31 02:17:21 +03:00
<span class="identifier">RUN_ONLY_IN_PHASE</span><span class="plain">(</span><span class="constant">GRAPH_CONSTRUCTION_INBUILD_PHASE</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
2020-04-01 22:43:13 +03:00
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">KV</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">; </span> <span class="comment">the kit vertex</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">BVL</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">); </span> <span class="comment">list of vertices for the binaries</span>
&lt;<span class="cwebmacro">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</span>&gt;<span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">CV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">); </span> <span class="comment">the contents page vertex</span>
&lt;<span class="cwebmacro">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>&gt;<span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Kits::find_sections</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</span>&gt;<span class="plain">;</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inbuild_requirement</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::construct_graph is used in 4/km (<a href="4-km.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges to the binaries for each architecture</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-02-27 13:18:25 +02:00
<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>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">BV</span><span class="plain">);</span>
<span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="identifier">assimilate_using_inter_skill</span><span class="plain">,</span>
<span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">BV</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">BVL</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_2"></a><b>&#167;13.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges from the binary vertices to the contents vertex</span> <span class="cwebmacronumber">13.2</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-02-27 13:18:25 +02:00
<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>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_3"></a><b>&#167;13.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add build edges from the binary vertices to each section vertex</span> <span class="cwebmacronumber">13.3</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-02-27 13:18:25 +02:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">;</span>
2020-04-01 22:43:13 +03:00
<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>
2020-02-27 13:18:25 +02:00
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">SF</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sections"</span><span class="plain">), </span><span class="identifier">segment</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">SV</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
<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">SV</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_4"></a><b>&#167;13.4. </b>Suppose our kit wants to include Locksmith by Emily Short. If that's an
extension we have already read in, we can place a use edge to its existing
build vertex. If not, the best we can do is a use edge to a requirement
vertex, i.e., to a vertex meaning "we would like Locksmith but can't find it".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Add use edges from the kit vertex to each extension it asks to include</span> <span class="cwebmacronumber">13.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inform_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Requirements::meets</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">)) {</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">);</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">RV</span><span class="plain"> = </span><span class="functiontext">Graphs::req_vertex</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">);</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">KV</span><span class="plain">, </span><span class="identifier">RV</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-04-01 22:43:13 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p>
<pre class="display">
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Kits::find_sections</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain">) {</span>
<span class="reserved">kit_contents_section_state</span><span class="plain"> </span><span class="identifier">CSS</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.active</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.sects</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">contents_page</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="functiontext">Kits::read_contents</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">CSS</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CSS</span><span class="element">.sects</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-30 15:25:23 +03:00
<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>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">sects</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">text_stream</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">kit_contents_section_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::read_contents</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">kit_contents_section_state</span><span class="plain"> *</span><span class="identifier">CSS</span><span class="plain"> = (</span><span class="reserved">kit_contents_section_state</span><span class="plain"> *) </span><span class="identifier">state</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Sections"</span><span class="plain">))</span>
<span class="identifier">CSS</span><span class="plain">-</span><span class="element">&gt;active</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" (%c+)"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">CSS</span><span class="plain">-</span><span class="element">&gt;active</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</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="string">".i6t"</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">CSS</span><span class="plain">-</span><span class="element">&gt;sects</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
2020-02-27 13:18:25 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Kits::find_sections is used in <a href="#SP13">&#167;13</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-30 15:25:23 +03:00
<p class="endnote">The function Kits::read_contents appears nowhere else.</p>
<p class="endnote">The structure kit_contents_section_state is private to this section.</p>
2020-02-27 13:18:25 +02:00
<hr class="tocbar">
2020-03-31 02:17:21 +03:00
<ul class="toc"><li><a href="5-es.html">Back to 'Extension Services'</a></li><li><a href="5-ls.html">Continue with 'Language Services'</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>