1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 00:24:22 +03:00
inform7/docs/core-module/27-pc.html

553 lines
72 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2019-04-17 20:19:03 +03:00
<title>27/cm</title>
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '27/pc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#27">Chapter 27: Bridge to Inter Module</a></li><li><b>Packaging</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Package requests. </b>In the same way that inames are created as shadows of eventual inter symbols,
and omly converted into the real thing on demand, "package requests" are
shadowy packages. The process of turning them into real inter packages is
called "incarnation".
</p>
2019-03-17 14:40:57 +02:00
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_PRCS_AT_ONCE</span><span class="plain"> 11</span>
2019-03-17 14:40:57 +02:00
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">eventual_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">eventual_type</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">actual_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">parent_request</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">write_position</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">counters</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">submodule_request_counter</span></code></span>
2019-03-17 14:40:57 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">package_request</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">submodule_request_counter</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">counter_id</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">counter_value</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">submodule_request_counter</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2019-04-17 20:19:03 +03:00
<p class="endnote">The structure package_request is accessed in 26/iti, 27/hl, 27/ei and here.</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The structure submodule_request_counter is private to this section.</p>
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="display">
2019-04-18 11:51:47 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain">);</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_name</span><span class="plain"> = </span><span class="identifier">name</span><span class="plain">;</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_type</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">;</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;actual_package</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-04-18 11:51:47 +03:00
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain"> = </span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::new_IRS</span><span class="plain">(</span><span class="functiontext">Emit::repository</span><span class="plain">());</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;counters</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function Packaging::request is used in <a href="#SP10">&#167;10</a>, <a href="#SP10_1">&#167;10.1</a>, <a href="#SP11">&#167;11</a>, 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/hl (<a href="27-hl.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>In the debugging log, package requests are printed in a form looking a
little like URLs, except that they run in the reverse order, innermost first
and outermost last: to make this more visually clear, backslashes rather
than forward slashes are used as dividers.
</p>
<pre class="display">
2019-03-17 14:40:57 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::log</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</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">LOG</span><span class="plain">(</span><span class="string">"&lt;null-package&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">++ &gt; 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">"</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="element">&gt;actual_package</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;actual_package</span><span class="plain">-&gt;</span><span class="identifier">package_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"'%n'"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_name</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">R</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. State, entry and exit. </b>PRs continue to be useful even after incarnation, though, because each one
also contains a "write position". This is where emitted Inter code will go;
and it means that not all of the code inside a package needs to be written
at the same time. We can come and go as we please, adding code to packages
all over the hierarchy, simply by switching to the write position in the
package we wsnt to extend next.
</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph">That switching is called "entering" a package. Every entry must be followed
by a matching exit, which restores the write position to where it was before
the entry. To restore state we need a way to record it, so:
</p>
2019-03-17 14:40:57 +02:00
<pre class="display">
2019-03-17 14:40:57 +02:00
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">packaging_state</span><span class="plain"> {</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">saved_IRS</span><span class="plain">;</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">saved_enclosure</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">packaging_state</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The structure packaging_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It is not legal to write to the following state, which exists only to
initialise variables to neutral contents (and thus to avoid warnings
generated because clang is not able to prove that they will not be used
in an uninitialised state &mdash; though in fact they will not).
</p>
<pre class="display">
2019-03-17 14:40:57 +02:00
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::stateless</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">PS</span><span class="plain">;</span>
<span class="identifier">PS</span><span class="element">.saved_IRS</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">PS</span><span class="element">.saved_enclosure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">PS</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::stateless is used in 27/ei (<a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We will store the current state at all times in the following:
</p>
<pre class="display">
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">current_state</span><span class="plain">;</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">current_state</span><span class="element">.saved_IRS</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">current_state</span><span class="element">.saved_enclosure</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::at is used in <a href="#SP9">&#167;9</a>, 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP4">&#167;4</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Packaging::enclosure is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/ei (<a href="27-ei.html#SP5">&#167;5</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>States are intentionally very lightweight, and in particular they contain
pointers to the IRS structures rather than containing a copy thereof. But
those pointers have to point somewhere, and this is where: to a stack of
IRS structures.
</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph">The maximum here is beyond plenty: it's not the maximum hierarchical depth
of the Inter output, it's the maximum number of times that Inform interrupts
itself during compilation.
</p>
2019-03-17 14:40:57 +02:00
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_PACKAGING_ENTRY_DEPTH</span><span class="plain"> 128</span>
2019-03-17 14:40:57 +02:00
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">packaging_entry_sp</span><span class="plain"> = 0;</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">packaging_entry_stack</span><span class="plain">[</span><span class="constant">MAX_PACKAGING_ENTRY_DEPTH</span><span class="plain">];</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">IRS</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">packaging_entry_sp</span><span class="plain"> &gt;= </span><span class="constant">MAX_PACKAGING_ENTRY_DEPTH</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"packaging entry too deep"</span><span class="plain">);</span>
<span class="identifier">packaging_entry_stack</span><span class="plain">[</span><span class="identifier">packaging_entry_sp</span><span class="plain">] = </span><span class="identifier">IRS</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> &amp;(</span><span class="identifier">packaging_entry_stack</span><span class="plain">[</span><span class="identifier">packaging_entry_sp</span><span class="plain">++]);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::pop_IRS</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">packaging_entry_sp</span><span class="plain"> &lt;= 0) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"package stack underflow"</span><span class="plain">);</span>
<span class="identifier">packaging_entry_sp</span><span class="plain">--;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::push_IRS is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">The function Packaging::pop_IRS is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The "current enclosure" ceases to be null the moment the <code class="display"><span class="extract">main</span></code> package
is created, and from then on, it is always an enclosing package:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::initialise_IRS</span><span class="plain">(</span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">current_state</span><span class="element">.saved_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::new_IRS</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">current_state</span><span class="element">.saved_enclosure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain">) {</span>
<span class="identifier">current_state</span><span class="element">.saved_IRS</span><span class="plain"> = </span><span class="identifier">to</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">PR</span><span class="plain">) &amp;&amp; (</span><span class="identifier">PR</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">PR</span><span class="plain">-</span><span class="element">&gt;eventual_type</span><span class="plain">, </span><span class="identifier">ENCLOSING_IANN</span><span class="plain">) != 1))</span>
<span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">PR</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">;</span>
<span class="identifier">current_state</span><span class="element">.saved_enclosure</span><span class="plain"> = </span><span class="identifier">PR</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::move_write_position</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">to</span><span class="plain">, </span><span class="functiontext">Packaging::enclosure</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
2019-04-19 20:15:12 +03:00
<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">R</span><span class="plain"> = </span><span class="functiontext">Hierarchy::main</span><span class="plain">();</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Entering $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">current_state</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(&amp;(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain">), </span><span class="functiontext">Packaging::enclosure</span><span class="plain">());</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">bubble</span><span class="plain"> = </span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">());</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">bubble</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"[%d] Current enclosure is $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">packaging_entry_sp</span><span class="plain">, </span><span class="functiontext">Packaging::enclosure</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">save</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain">) {</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">save</span><span class="element">.saved_IRS</span><span class="plain">, </span><span class="identifier">save</span><span class="element">.saved_enclosure</span><span class="plain">);</span>
<span class="functiontext">Packaging::pop_IRS</span><span class="plain">();</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"[%d] Back to $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">packaging_entry_sp</span><span class="plain">, </span><span class="functiontext">Packaging::enclosure</span><span class="plain">());</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::initialise_IRS is used in 27/ei (<a href="27-ei.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Packaging::set_packaging_state is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function Packaging::move_write_position appears nowhere else.</p>
<p class="endnote">The function Packaging::enter_home_of is used in 27/in (<a href="27-in.html#SP5">&#167;5</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function Packaging::enter is used in 27/ei (<a href="27-ei.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Packaging::exit is used in 27/in (<a href="27-in.html#SP5">&#167;5</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Incarnation. </b></p>
<pre class="display">
2019-03-17 14:40:57 +02:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</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">internal_error</span><span class="plain">(</span><span class="string">"can't incarnate null request"</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="element">&gt;actual_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Request to make incarnate $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Packaging::enclosure</span><span class="plain">(); </span> <span class="comment">This will not change</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">) {</span>
<span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">);</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">save_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::at</span><span class="plain">();</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(&amp;(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain">), </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">snapshot</span><span class="plain"> = </span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">();</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(&amp;</span><span class="identifier">snapshot</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="functiontext">Emit::package</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_name</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_type</span><span class="plain">, &amp;(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;actual_package</span><span class="plain">));</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain"> = </span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">();</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">save_IRS</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">snapshot</span><span class="plain"> = </span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">();</span>
<span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">save_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::at</span><span class="plain">();</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(&amp;</span><span class="identifier">snapshot</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="functiontext">Emit::package</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_name</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;eventual_type</span><span class="plain">, &amp;(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;actual_package</span><span class="plain">));</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain"> = </span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">();</span>
<span class="functiontext">Packaging::set_packaging_state</span><span class="plain">(</span><span class="identifier">save_IRS</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Made incarnate $X bookmark $5\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, &amp;(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;write_position</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;actual_package</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="functiontext">Packaging::scope</span><span class="plain">(</span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't determine scope of null name"</span><span class="plain">);</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::get_global_symbols</span><span class="plain">(</span><span class="functiontext">Emit::repository</span><span class="plain">());</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::incarnate is used in <a href="#SP8">&#167;8</a>, 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-18 03:53:27 +03:00
<p class="endnote">The function Packaging::scope is used in 27/in (<a href="27-in.html#SP8">&#167;8</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="display">
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">generic_pr</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request_generic</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">generic_pr</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">generic_pr</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span>
2019-04-18 03:53:27 +03:00
<span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"generic"</span><span class="plain">, </span><span class="functiontext">Hierarchy::resources</span><span class="plain">()),</span>
2019-04-19 16:36:05 +03:00
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"_module"</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">generic_pr</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">synoptic_pr</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request_synoptic</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">synoptic_pr</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">synoptic_pr</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span>
2019-04-18 03:53:27 +03:00
<span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"synoptic"</span><span class="plain">, </span><span class="functiontext">Hierarchy::resources</span><span class="plain">()),</span>
2019-04-19 16:36:05 +03:00
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"_module"</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">synoptic_pr</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">submodule_identity</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">submodule_name</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">submodule_identity</span><span class="plain">;</span>
<span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="functiontext">Packaging::register_submodule</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">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">submodule_identity</span><span class="plain">);</span>
<span class="identifier">sid</span><span class="plain">-</span><span class="element">&gt;submodule_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="reserved">return</span><span class="plain"> </span><span class="identifier">sid</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">submodule_request</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">which_submodule</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">where_found</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">submodule_request</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">submodule_requests</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">submodules</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">submodule_identity</span></code></span>
<span class="plain">} </span><span class="reserved">submodule_requests</span><span class="plain">;</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::resources_for_new_submodule</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">submodule_requests</span><span class="plain"> *</span><span class="identifier">SR</span><span class="plain">) {</span>
2019-04-18 03:53:27 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">package_iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="functiontext">Hierarchy::resources</span><span class="plain">());</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">package_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"_module"</span><span class="plain">));</span>
<span class="functiontext">Packaging::initialise_submodules</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">);</span>
2019-04-13 20:58:43 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::initialise_submodules</span><span class="plain">(</span><span class="reserved">submodule_requests</span><span class="plain"> *</span><span class="identifier">SR</span><span class="plain">) {</span>
<span class="identifier">SR</span><span class="plain">-</span><span class="element">&gt;submodules</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">submodule_request</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">generic_subpackages_initialised</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">submodule_requests</span><span class="plain"> </span><span class="identifier">generic_subpackages</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">synoptic_subpackages_initialised</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">submodule_requests</span><span class="plain"> </span><span class="identifier">synoptic_subpackages</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request_resource</span><span class="plain">(</span><span class="reserved">compilation_module</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
<span class="reserved">submodule_requests</span><span class="plain"> *</span><span class="identifier">SR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">parent</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">SR</span><span class="plain"> = </span><span class="functiontext">Modules::subpackages</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">parent</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;resources</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">generic_subpackages_initialised</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">generic_subpackages_initialised</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Packaging::initialise_submodules</span><span class="plain">(&amp;</span><span class="identifier">generic_subpackages</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="identifier">SR</span><span class="plain"> = &amp;</span><span class="identifier">generic_subpackages</span><span class="plain">;</span>
<span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Packaging::request_generic</span><span class="plain">();</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
2019-04-12 03:47:23 +03:00
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::local_resource</span><span class="plain">(</span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::request_resource</span><span class="plain">(</span><span class="functiontext">Modules::find</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::generic_resource</span><span class="plain">(</span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">generic_subpackages_initialised</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">generic_subpackages_initialised</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Packaging::initialise_submodules</span><span class="plain">(&amp;</span><span class="identifier">generic_subpackages</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">submodule_requests</span><span class="plain"> *</span><span class="identifier">SR</span><span class="plain"> = &amp;</span><span class="identifier">generic_subpackages</span><span class="plain">;</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Packaging::request_generic</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::synoptic_resource</span><span class="plain">(</span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">synoptic_subpackages_initialised</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">synoptic_subpackages_initialised</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Packaging::initialise_submodules</span><span class="plain">(&amp;</span><span class="identifier">synoptic_subpackages</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">submodule_requests</span><span class="plain"> *</span><span class="identifier">SR</span><span class="plain"> = &amp;</span><span class="identifier">synoptic_subpackages</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Packaging::request_synoptic</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-04-12 03:47:23 +03:00
<p class="endnote">The function Packaging::request_generic appears nowhere else.</p>
<p class="endnote">The function Packaging::request_synoptic appears nowhere else.</p>
<p class="endnote">The function Packaging::register_submodule is used in 27/hr (<a href="27-hr.html#SP1_2">&#167;1.2</a>, <a href="27-hr.html#SP1_4">&#167;1.4</a>, <a href="27-hr.html#SP1_6">&#167;1.6</a>, <a href="27-hr.html#SP1_8">&#167;1.8</a>, <a href="27-hr.html#SP1_10">&#167;1.10</a>, <a href="27-hr.html#SP1_12">&#167;1.12</a>, <a href="27-hr.html#SP1_14">&#167;1.14</a>, <a href="27-hr.html#SP1_16">&#167;1.16</a>, <a href="27-hr.html#SP1_18">&#167;1.18</a>, <a href="27-hr.html#SP1_20">&#167;1.20</a>, <a href="27-hr.html#SP1_22">&#167;1.22</a>, <a href="27-hr.html#SP1_24">&#167;1.24</a>, <a href="27-hr.html#SP1_26">&#167;1.26</a>, <a href="27-hr.html#SP1_28">&#167;1.28</a>, <a href="27-hr.html#SP1_30">&#167;1.30</a>, <a href="27-hr.html#SP1_32">&#167;1.32</a>, <a href="27-hr.html#SP1_34">&#167;1.34</a>, <a href="27-hr.html#SP1_36">&#167;1.36</a>, <a href="27-hr.html#SP1_38">&#167;1.38</a>, <a href="27-hr.html#SP1_40">&#167;1.40</a>, <a href="27-hr.html#SP1_42">&#167;1.42</a>, <a href="27-hr.html#SP1_44">&#167;1.44</a>).</p>
2019-04-13 20:58:43 +03:00
<p class="endnote">The function Packaging::resources_for_new_submodule is used in 27/cm (<a href="27-cm.html#SP2">&#167;2</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function Packaging::initialise_submodules appears nowhere else.</p>
2019-03-17 14:40:57 +02:00
2019-04-17 20:19:03 +03:00
<p class="endnote">The function Packaging::request_resource is used in 27/hl (<a href="27-hl.html#SP2">&#167;2</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-13 20:58:43 +03:00
<p class="endnote">The function Packaging::local_resource appears nowhere else.</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function Packaging::generic_resource is used in 27/hl (<a href="27-hl.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Packaging::synoptic_resource is used in 27/hl (<a href="27-hl.html#SP1">&#167;1</a>).</p>
2019-04-13 20:58:43 +03:00
<p class="endnote">The structure submodule_identity is private to this section.</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The structure submodule_request is private to this section.</p>
<p class="endnote">The structure submodule_requests is private to this section.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Handle the resource request</span> <span class="cwebmacronumber">10.1</span>&gt; =
2019-03-17 14:40:57 +02:00
</code></p>
<pre class="displaydefn">
<span class="reserved">submodule_request</span><span class="plain"> *</span><span class="identifier">sr</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">, </span><span class="reserved">submodule_request</span><span class="plain">, </span><span class="identifier">SR</span><span class="plain">-</span><span class="element">&gt;submodules</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sid</span><span class="plain"> == </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;which_submodule</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;where_found</span><span class="plain">;</span>
2019-04-18 03:53:27 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">sid</span><span class="plain">-</span><span class="element">&gt;submodule_name</span><span class="plain">, </span><span class="identifier">parent</span><span class="plain">);</span>
<span class="identifier">sr</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">submodule_request</span><span class="plain">);</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;which_submodule</span><span class="plain"> = </span><span class="identifier">sid</span><span class="plain">;</span>
2019-04-19 16:36:05 +03:00
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;where_found</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"_submodule"</span><span class="plain">));</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">, </span><span class="reserved">submodule_request</span><span class="plain">, </span><span class="identifier">SR</span><span class="plain">-</span><span class="element">&gt;submodules</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;where_found</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a> (three times).</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_PRCS</span><span class="plain"> 500</span>
</pre>
2019-03-17 14:40:57 +02:00
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_pr_counters_registered</span><span class="plain"> = 0;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">pr_counter_names</span><span class="plain">[</span><span class="constant">MAX_PRCS</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Packaging::register_counter</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">id</span><span class="plain"> = </span><span class="identifier">no_pr_counters_registered</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">id</span><span class="plain"> &lt; 0) || (</span><span class="identifier">id</span><span class="plain"> &gt;= </span><span class="constant">MAX_PRCS</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"out of range"</span><span class="plain">);</span>
<span class="identifier">pr_counter_names</span><span class="plain">[</span><span class="identifier">id</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="reserved">return</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">;</span>
2019-04-13 20:58:43 +03:00
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::supply_iname</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">what_for</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">internal_error</span><span class="plain">(</span><span class="string">"no request"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">what_for</span><span class="plain"> &lt; 0) || (</span><span class="identifier">what_for</span><span class="plain"> &gt;= </span><span class="identifier">no_pr_counters_registered</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"out of range"</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="element">&gt;counters</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;counters</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">submodule_request_counter</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = -1;</span>
<span class="reserved">submodule_request_counter</span><span class="plain"> *</span><span class="identifier">src</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">src</span><span class="plain">, </span><span class="reserved">submodule_request_counter</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;counters</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">src</span><span class="plain">-</span><span class="element">&gt;counter_id</span><span class="plain"> == </span><span class="identifier">what_for</span><span class="plain">) {</span>
<span class="identifier">N</span><span class="plain"> = ++(</span><span class="identifier">src</span><span class="plain">-</span><span class="element">&gt;counter_value</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt; 0) {</span>
<span class="reserved">submodule_request_counter</span><span class="plain"> *</span><span class="identifier">src</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">submodule_request_counter</span><span class="plain">);</span>
<span class="identifier">src</span><span class="plain">-</span><span class="element">&gt;counter_id</span><span class="plain"> = </span><span class="identifier">what_for</span><span class="plain">;</span>
<span class="identifier">src</span><span class="plain">-</span><span class="element">&gt;counter_value</span><span class="plain"> = 1;</span>
<span class="identifier">N</span><span class="plain"> = 1;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">src</span><span class="plain">, </span><span class="reserved">submodule_request_counter</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;counters</span><span class="plain">);</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="string">"%S_%d"</span><span class="plain">, </span><span class="identifier">pr_counter_names</span><span class="plain">[</span><span class="identifier">what_for</span><span class="plain">], </span><span class="identifier">N</span><span class="plain">);</span>
2019-04-18 03:53:27 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::function</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">temp_iname</span><span class="plain">) {</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::function</span><span class="plain">());</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">temp_iname</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%n"</span><span class="plain">, </span><span class="identifier">temp_iname</span><span class="plain">);</span>
2019-04-19 16:36:05 +03:00
<span class="functiontext">Emit::change_translation</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::function_text</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">translation</span><span class="plain">) {</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::function</span><span class="plain">());</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-04-17 20:19:03 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">translation</span><span class="plain">)</span>
2019-04-19 16:36:05 +03:00
<span class="functiontext">Emit::change_translation</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">translation</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::datum_text</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">translation</span><span class="plain">) {</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"_data"</span><span class="plain">));</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">translation</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-04-12 03:47:23 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Packaging::housed_in_function</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-04-18 11:51:47 +03:00
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-04-19 16:36:05 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;eventual_type</span><span class="plain"> == </span><span class="functiontext">PackageTypes::function</span><span class="plain">()) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-04-17 20:19:03 +03:00
<p class="endnote">The function Packaging::register_counter is used in 27/hr (<a href="27-hr.html#SP1">&#167;1</a>), 27/hl (<a href="27-hl.html#SP2">&#167;2</a>).</p>
2019-04-13 20:58:43 +03:00
2019-04-17 20:19:03 +03:00
<p class="endnote">The function Packaging::supply_iname is used in 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/hl (<a href="27-hl.html#SP2">&#167;2</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-18 03:53:27 +03:00
<p class="endnote">The function Packaging::function is used in 27/hl (<a href="27-hl.html#SP1">&#167;1</a>, <a href="27-hl.html#SP1_1">&#167;1.1</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-18 03:53:27 +03:00
<p class="endnote">The function Packaging::function_text is used in 27/hl (<a href="27-hl.html#SP1">&#167;1</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-12 16:47:00 +03:00
<p class="endnote">The function Packaging::datum_text is used in 27/hl (<a href="27-hl.html#SP1">&#167;1</a>).</p>
2019-04-12 03:47:23 +03:00
2019-04-19 20:15:12 +03:00
<p class="endnote">The function Packaging::housed_in_function is used in 27/ei (<a href="27-ei.html#SP3">&#167;3</a>).</p>
2019-03-17 14:40:57 +02:00
<hr class="tocbar">
2019-04-19 16:36:05 +03:00
<ul class="toc"><li><a href="27-cm.html">Back to 'Compilation Modules'</a></li><li><a href="27-pt.html">Continue with 'Package Types'</a></li></ul><hr class="tocbar">
<!--End of weave-->
2019-03-17 14:40:57 +02:00
</body>
</html>