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

459 lines
66 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-->
2019-04-19 16:36:05 +03:00
<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></p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"></p>
<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>
<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(%d)"</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="identifier">R</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"--(%d)"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<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>
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::request is used in <a href="#SP5">&#167;5</a>, <a href="#SP5_1">&#167;5.1</a>, <a href="#SP6">&#167;6</a>, 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
<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>
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </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">current_enclosure</span><span class="plain"> = </span><span class="identifier">NULL</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">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>
<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>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::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>
2019-04-18 11:51:47 +03:00
<span class="reserved">return</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_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>
2019-04-18 03:53:27 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="functiontext">Packaging::home_of</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::enter_current_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="functiontext">Packaging::enter</span><span class="plain">(</span><span class="identifier">current_enclosure</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::current_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_enclosure</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::stateless is used in 21/rb (<a href="21-rb.html#SP24_1">&#167;24.1</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::home_of is used in 5/ins (<a href="5-ins.html#SP34">&#167;34</a>), 12/cdp (<a href="12-cdp.html#SP5">&#167;5</a>), 13/rsfk (<a href="13-rsfk.html#SP22">&#167;22</a>), 26/rt (<a href="26-rt.html#SP3">&#167;3</a>, <a href="26-rt.html#SP4">&#167;4</a>), 27/hr (<a href="27-hr.html#SP3">&#167;3</a>), 27/hl (<a href="27-hl.html#SP1">&#167;1</a>), 27/ei (<a href="27-ei.html#SP3">&#167;3</a>).</p>
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::enter_home_of is used in 5/nv (<a href="5-nv.html#SP16">&#167;16</a>, <a href="5-nv.html#SP25">&#167;25</a>), 13/rsfk (<a href="13-rsfk.html#SP16_2">&#167;16.2</a>), 17/tl (<a href="17-tl.html#SP13">&#167;13</a>), 21/rl2 (<a href="21-rl2.html#SP20">&#167;20</a>), 22/ph (<a href="22-ph.html#SP12">&#167;12</a>), 26/rt (<a href="26-rt.html#SP1">&#167;1</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function Packaging::enter_current_enclosure appears nowhere else.</p>
2019-03-17 14:40:57 +02:00
2019-04-16 22:38:10 +03:00
<p class="endnote">The function Packaging::current_enclosure is used in 17/ts (<a href="17-ts.html#SP8">&#167;8</a>, <a href="17-ts.html#SP8_1">&#167;8.1</a>), 18/lc (<a href="18-lc.html#SP5">&#167;5</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The structure packaging_state is private to this section.</p>
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></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"> 32</span>
</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="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>
<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="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain"> = </span><span class="functiontext">Emit::IRS</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="functiontext">Emit::move_write_position</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>
2019-04-19 16:36:05 +03:00
<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="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">packaging_entry_sp</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%d: $6\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">packaging_entry_stack</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="identifier">current_package</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="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">packaging_entry_stack</span><span class="plain">[</span><span class="identifier">packaging_entry_sp</span><span class="plain">] = </span><span class="functiontext">Emit::bookmark_bubble</span><span class="plain">();</span>
<span class="functiontext">Emit::move_write_position</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="identifier">packaging_entry_sp</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">IRS</span><span class="plain">;</span>
<span class="identifier">PS</span><span class="element">.saved_enclosure</span><span class="plain"> = </span><span class="identifier">current_enclosure</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">; </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain">)</span>
2019-04-13 20:58:43 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">S</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>
2019-03-17 14:40:57 +02:00
<span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;parent_request</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
<span class="identifier">current_enclosure</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</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="identifier">current_enclosure</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>
<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">PS</span><span class="plain">) {</span>
<span class="identifier">current_enclosure</span><span class="plain"> = </span><span class="identifier">PS</span><span class="element">.saved_enclosure</span><span class="plain">;</span>
<span class="identifier">packaging_entry_sp</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="identifier">current_enclosure</span><span class="plain">);</span>
<span class="functiontext">Emit::move_write_position</span><span class="plain">(</span><span class="identifier">PS</span><span class="element">.saved_IRS</span><span class="plain">);</span>
<span class="plain">}</span>
<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">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="identifier">NULL</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;parent_request</span><span class="plain">)</span>
<span class="identifier">save_IRS</span><span class="plain"> = </span><span class="functiontext">Emit::move_write_position</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">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_save_IRS</span><span class="plain"> = </span><span class="functiontext">Emit::move_write_position</span><span class="plain">(&amp;</span><span class="identifier">snapshot</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">Emit::move_write_position</span><span class="plain">(</span><span class="identifier">save_save_IRS</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;parent_request</span><span class="plain">)</span>
<span class="functiontext">Emit::move_write_position</span><span class="plain">(</span><span class="identifier">save_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">"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>
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::enter is used in <a href="#SP3">&#167;3</a>, 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::exit is used in 5/nv (<a href="5-nv.html#SP16">&#167;16</a>, <a href="5-nv.html#SP25">&#167;25</a>), 13/rsfk (<a href="13-rsfk.html#SP16_2">&#167;16.2</a>), 17/tl (<a href="17-tl.html#SP13">&#167;13</a>), 21/rl2 (<a href="21-rl2.html#SP20">&#167;20</a>), 22/ph (<a href="22-ph.html#SP12">&#167;12</a>), 26/rt (<a href="26-rt.html#SP4">&#167;4</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-19 16:36:05 +03:00
<p class="endnote">The function Packaging::incarnate is used in 21/rl (<a href="21-rl.html#SP9">&#167;9</a>), 27/ei (<a href="27-ei.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::scope is used in 27/in (<a href="27-in.html#SP8">&#167;8</a>).</p>
2019-03-17 14:40:57 +02:00
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </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>
2019-04-19 16:36:05 +03:00
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">5.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>
2019-04-19 16:36:05 +03:00
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">5.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>
2019-04-19 16:36:05 +03:00
&lt;<span class="cwebmacro">Handle the resource request</span> <span class="cwebmacronumber">5.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
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Handle the resource request</span> <span class="cwebmacronumber">5.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>
2019-04-19 16:36:05 +03:00
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a> (three times).</p>
2019-03-17 14:40:57 +02:00
2019-04-19 16:36:05 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </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 16:36:05 +03:00
<p class="endnote">The function Packaging::housed_in_function is used in 26/rt (<a href="26-rt.html#SP4">&#167;4</a>), 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>