1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/inter-module/2-st.html
2019-08-31 13:56:36 +01:00

588 lines
104 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/inl</title>
<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 '2/st' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">inter</a></li><li><a href="index.html#2">Chapter 2: Interoperability</a></li><li><b>Symbols Tables</b></li></ul><p class="purpose">To manage searchable tables of named symbols.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Symbols tables</a></li><li><a href="#SP4">&#167;4. From name to symbol</a></li><li><a href="#SP5">&#167;5. Creation by unique name</a></li><li><a href="#SP6">&#167;6. From symbol to ID</a></li><li><a href="#SP8">&#167;8. From ID to symbol</a></li><li><a href="#SP10">&#167;10. Equations</a></li><li><a href="#SP11">&#167;11. URL-style symbol names</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Symbols tables. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_symbols_table</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">owning_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">symbols_lookup</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">size</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_symbol</span><span class="plain"> **</span><span class="identifier">symbol_array</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n_index</span><span class="plain">;</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">next_free_ID</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inter_symbols_table</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure inter_symbols_table is accessed in 2/in, 2/tw, 2/pck, 2/sym, 2/cnn, 2/trn, 3/iibf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">INITIAL_INTER_SYMBOLS_ID_RANGE</span><span class="plain"> 16</span>
<span class="definitionkeyword">define</span> <span class="constant">SYMBOLS_THRESHOLD</span><span class="plain"> 5</span>
</pre>
<pre class="display">
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain">);</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain"> = </span><span class="constant">INITIAL_INTER_SYMBOLS_ID_RANGE</span><span class="plain">;</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain"> = (</span><span class="reserved">inter_symbol</span><span class="plain"> **)</span>
<span class="identifier">Memory::I7_calloc</span><span class="plain">(</span><span class="constant">INITIAL_INTER_SYMBOLS_ID_RANGE</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *), </span><span class="constant">INTER_SYMBOLS_MREASON</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="constant">INITIAL_INTER_SYMBOLS_ID_RANGE</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;n_index</span><span class="plain"> = 0;</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;owning_package</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;next_free_ID</span><span class="plain"> = </span><span class="constant">SYMBOL_BASE_VAL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ST</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::log</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vst</span><span class="plain">) {</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = (</span><span class="reserved">inter_symbols_table</span><span class="plain"> *) </span><span class="identifier">vst</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ST</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;null-stable&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;%d:"</span><span class="plain">, </span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;owning_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(root)"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$6"</span><span class="plain">, </span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;owning_package</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&gt;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::new is used in 2/tw (<a href="2-tw.html#SP3">&#167;3</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">&#167;1.4.2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::log is used in 1/im (<a href="1-im.html#SP3_6">&#167;3.6</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="identifier">LOOP_OVER_SYMBOLS_TABLE</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">T</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">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</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">NULL</span><span class="plain">)</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::write_declarations</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ST</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">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">ST</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="functiontext">Inter::Symbols::write_declaration</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">create</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">equating</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</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 IST"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</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">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;next_free_ID</span><span class="plain"> - </span><span class="constant">SYMBOL_BASE_VAL</span><span class="plain"> &gt;= </span><span class="constant">SYMBOLS_THRESHOLD</span><span class="plain">)) {</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain"> = </span><span class="identifier">Dictionaries::new</span><span class="plain">(</span><span class="constant">INITIAL_INTER_SYMBOLS_ID_RANGE</span><span class="plain">, </span><span class="identifier">FALSE</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">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">) {</span>
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">A</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain"> == </span><span class="identifier">NULL</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">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equating</span><span class="plain">) {</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">) </span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">A</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">dict_entry</span><span class="plain"> *</span><span class="identifier">de</span><span class="plain"> = </span><span class="identifier">Dictionaries::find</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">de</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">inter_symbol</span><span class="plain"> *) </span><span class="identifier">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equating</span><span class="plain">) {</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">) </span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">A</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">create</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</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">ID</span><span class="plain"> == 0) </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;next_free_ID</span><span class="plain">++;</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::new</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">) {</span>
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbols_lookup</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">ST</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index</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="reserved">int</span><span class="plain">) </span><span class="constant">SYMBOL_BASE_VAL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index</span><span class="plain"> &lt; 0) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad symbol ID index"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index</span><span class="plain"> &gt;= </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_size</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">index</span><span class="plain"> &gt;= </span><span class="identifier">new_size</span><span class="plain">) </span><span class="identifier">new_size</span><span class="plain"> = </span><span class="identifier">new_size</span><span class="plain"> * 4;</span>
<span class="reserved">inter_symbol</span><span class="plain"> **</span><span class="identifier">enlarged</span><span class="plain"> = (</span><span class="reserved">inter_symbol</span><span class="plain"> **)</span>
<span class="identifier">Memory::I7_calloc</span><span class="plain">(</span><span class="identifier">new_size</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *), </span><span class="constant">INTER_SYMBOLS_MREASON</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">new_size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">)</span>
<span class="identifier">enlarged</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">else</span>
<span class="identifier">enlarged</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Memory::I7_free</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">, </span><span class="constant">INTER_SYMBOLS_MREASON</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">);</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain"> = </span><span class="identifier">new_size</span><span class="plain">;</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain"> = </span><span class="identifier">enlarged</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index</span><span class="plain"> &gt;= </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"inter symbols expansion failed"</span><span class="plain">);</span>
<span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">index</span><span class="plain">] = </span><span class="identifier">ST</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ST</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::write_declarations is used in 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::search_inner is used in <a href="#SP4">&#167;4</a>, <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. From name to symbol. </b></p>
<pre class="display">
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_creating</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, 0, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_creating_at_ID</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_main</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Site::main_package_if_it_exists</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_basics</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::basics</span><span class="plain">(</span><span class="identifier">I</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_veneer</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::veneer</span><span class="plain">(</span><span class="identifier">I</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_template</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::template</span><span class="plain">(</span><span class="identifier">I</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_main_or_basics</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_basics</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_veneer</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_in_main</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">symbol</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name is used in <a href="#SP5">&#167;5</a>, <a href="#SP11">&#167;11</a>, 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/trn (<a href="2-trn.html#SP3_1">&#167;3.1</a>), 3/iitf (<a href="3-iitf.html#SP1">&#167;1</a>), 3/idt (<a href="3-idt.html#SP3">&#167;3</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_not_equating is used in 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_creating is used in <a href="#SP5">&#167;5</a>, 2/trn (<a href="2-trn.html#SP3_1_1">&#167;3.1.1</a>), 3/iitf (<a href="3-iitf.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_creating_at_ID is used in 3/iibf (<a href="3-iibf.html#SP1_4_2">&#167;1.4.2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_in_main appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_in_basics appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_in_veneer appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_in_template appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_in_main_or_basics appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Creation by unique name. </b></p>
<pre class="display">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::render_identifier_unique</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</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">inter_symbol</span><span class="plain"> *</span><span class="identifier">ST</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="identifier">A</span><span class="plain"> = 0, </span><span class="identifier">still_unduplicated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">name</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">still_unduplicated</span><span class="plain">) {</span>
<span class="identifier">name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">still_unduplicated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TAIL</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TAIL</span><span class="plain">, </span><span class="string">"_%d"</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">A</span><span class="plain"> &gt; 0) </span><span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">) - </span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">A</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">TAIL</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">TAIL</span><span class="plain">);</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, 31);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TAIL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">name</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</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">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_creating</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">,</span>
<span class="functiontext">Inter::SymbolsTables::render_identifier_unique</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::render_identifier_unique is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function Inter::SymbolsTables::create_with_unique_name is used in 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. From symbol to ID. </b>Symbols are represented in Inter bytecode by their ID numbers, but these only
make sense in the context of a symbols table: i.e., the same ID can have
a different meaning in one inter frame than in another. We provide two ways
to access this: one following equations, the other not.
</p>
<pre class="display">
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::unequated_symbol_from_id</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</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">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index</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="reserved">int</span><span class="plain">) </span><span class="constant">SYMBOL_BASE_VAL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index</span><span class="plain"> &lt; 0) </span><span class="reserved">return</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">index</span><span class="plain"> &gt;= </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">) </span><span class="reserved">return</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">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">index</span><span class="plain">];</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::unequated_symbol_from_id</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</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;equated_to</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::unequated_symbol_from_id is used in 3/vi (<a href="3-vi.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_id is used in <a href="#SP7">&#167;7</a>, 2/sym (<a href="2-sym.html#SP4">&#167;4</a>), 2/trn (<a href="2-trn.html#SP3">&#167;3</a>), 3/iibf (<a href="3-iibf.html#SP1_5">&#167;1.5</a>), 3/vi (<a href="3-vi.html#SP1">&#167;1</a>), 3/idt (<a href="3-idt.html#SP2">&#167;2</a>, <a href="3-idt.html#SP3">&#167;3</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>It's convenient to have some abbreviations for common ways to access the above.
</p>
<pre class="display">
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="reserved">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;W.data</span><span class="plain">[</span><span class="identifier">x</span><span class="plain">]);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::global_symbol_from_frame_data</span><span class="plain">(</span><span class="reserved">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="functiontext">Inter::Node::globals</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;W.data</span><span class="plain">[</span><span class="identifier">x</span><span class="plain">]);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::local_symbol_from_id</span><span class="plain">(</span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">), </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_data_pair_and_table</span><span class="plain">(</span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain">, </span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val1</span><span class="plain"> == </span><span class="constant">ALIAS_IVAL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::symbol_from_data_pair_and_frame</span><span class="plain">(</span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain">, </span><span class="reserved">inter_tree_node</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="functiontext">Inter::SymbolsTables::symbol_from_data_pair_and_table</span><span class="plain">(</span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">, </span><span class="functiontext">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_frame_data is used in 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tdc (<a href="4-tdc.html#SP2">&#167;2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/trc (<a href="4-trc.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc4 (<a href="4-tpc4.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::global_symbol_from_frame_data is used in 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::local_symbol_from_id is used in 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_data_pair_and_table is used in 3/idt (<a href="3-idt.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_data_pair_and_frame appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. From ID to symbol. </b>If all we want is to read the ID of a symbol definitely present in the given
symbols table, that's easy:
</p>
<pre class="display">
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner_not_creating</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</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 symbol"</span><span class="plain">);</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::Tree::global_scope</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain"> != </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Symbol is $3, owned by $4, but we wanted ID from $4\</span><span class="plain">n</span><span class="string">"</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;owning_table</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"ID not available in this scope"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_not_creating</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner_not_creating</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_bookmark_and_symbol_not_creating</span><span class="plain">(</span><span class="reserved">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner_not_creating</span><span class="plain">(</span><span class="functiontext">Inter::Bookmarks::tree</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="functiontext">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::id_from_symbol_inner_not_creating appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::id_from_symbol_not_creating appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::id_from_bookmark_and_symbol_not_creating appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>However, things become more interesting if we want an ID for a symbol in
a context other than its home. We then create a new symbol in the current
context, equate it to the original, and return the ID of the new symbol.
</p>
<p class="inwebparagraph">Globals are not allowed to be reached this way, purely for efficiency's
sake: we don't want to proliferate equated symbols for primitives like
<code class="display"><span class="extract">!store</span></code>, not for package types like <code class="display"><span class="extract">_code</span></code>. (But it would work perfectly
well if we did.) It's therefore an internal error to call this routine with
a global symbol in any non-global context.
</p>
<pre class="display">
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner</span><span class="plain">(</span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</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 symbol"</span><span class="plain">);</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">G</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain"> != </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_SYMBOLS</span><span class="plain">, </span><span class="string">"Seek ID of $3 from $4, which is not its owner $4\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain"> == </span><span class="identifier">G</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Seek ID of $3 from $4, which is not its owner $4\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"attempted to equate to global"</span><span class="plain">);</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">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) &amp;&amp; (</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;equated_to</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;symbol_ID</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::render_identifier_unique</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::search_inner</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, 0, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_SYMBOLS</span><span class="plain">, </span><span class="string">"Equating $3 to new $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> != </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Want ID for $3 but there's already $3 locally which equates to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"external symbol clash"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner</span><span class="plain">(</span><span class="functiontext">Inter::Tree::global_scope</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_F</span><span class="plain">(</span><span class="reserved">inter_tree_node</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner</span><span class="plain">(</span><span class="functiontext">Inter::Node::globals</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_IRS_and_symbol</span><span class="plain">(</span><span class="reserved">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::id_from_symbol_inner</span><span class="plain">(</span><span class="functiontext">Inter::Tree::global_scope</span><span class="plain">(</span><span class="functiontext">Inter::Bookmarks::tree</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">)), </span><span class="functiontext">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::id_from_symbol_inner is used in 2/trn (<a href="2-trn.html#SP3_1">&#167;3.1</a>, <a href="2-trn.html#SP3_1_1">&#167;3.1.1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::id_from_symbol is used in 2/sym (<a href="2-sym.html#SP3">&#167;3</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::id_from_symbol_F is used in 5/tic (<a href="5-tic.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::id_from_IRS_and_symbol is used in 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tdc (<a href="4-tdc.html#SP2">&#167;2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/trc (<a href="4-trc.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc4 (<a href="4-tpc4.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">&#167;2</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">&#167;2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Equations. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_from</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_to</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S_from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">S_to</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">"bad symbol equation"</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> = </span><span class="identifier">S_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">) != </span><span class="constant">SOCKET_ISYMS</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">) != </span><span class="constant">PLUG_ISYMS</span><span class="plain">))</span>
<span class="functiontext">Inter::Symbols::set_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">, </span><span class="constant">EXTERNAL_ISYMS</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_SYMBOLS</span><span class="plain">, </span><span class="string">"Equate $3 to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S_from</span><span class="plain">, </span><span class="identifier">S_to</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">for</span><span class="plain"> (</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">S_from</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;equated_to</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == 20) {</span>
<span class="identifier">c</span><span class="plain"> = 0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">S_from</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> &lt; 20; </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">++)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%d. %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"probably circular symbol equation"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::equate_textual</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_from</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">if</span><span class="plain"> ((</span><span class="identifier">S_from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">name</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">"bad symbol equation"</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_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="functiontext">Inter::Symbols::set_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">, </span><span class="constant">EXTERNAL_ISYMS</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::make_plug</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_from</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">wanted</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S_from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">wanted</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">"bad link equation"</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">wanted</span><span class="plain">);</span>
<span class="functiontext">Inter::Symbols::set_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">, </span><span class="constant">PLUG_ISYMS</span><span class="plain">);</span>
<span class="functiontext">Inter::Symbols::set_type</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">, </span><span class="constant">MISC_ISYMT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::make_socket</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_from</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">wired_from</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S_from</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">"bad link equation"</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> = </span><span class="identifier">wired_from</span><span class="plain">;</span>
<span class="functiontext">Inter::Symbols::set_scope</span><span class="plain">(</span><span class="identifier">S_from</span><span class="plain">, </span><span class="constant">SOCKET_ISYMS</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::resolve_forward_references</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_error_location</span><span class="plain"> *</span><span class="identifier">eloc</span><span class="plain">) {</span>
<span class="functiontext">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Inter::SymbolsTables::rfr_visitor</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">PACKAGE_IST</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::rfr_visitor</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">inter_error_location</span><span class="plain"> *</span><span class="identifier">eloc</span><span class="plain"> = (</span><span class="reserved">inter_error_location</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain"> = </span><span class="functiontext">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack</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 package defined here"</span><span class="plain">);</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</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">"package with no symbols"</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">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">) == </span><span class="constant">PLUG_ISYMS</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_to</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="functiontext">Inter::Packages::tree</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">), </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Inter::Errors::issue</span><span class="plain">(</span><span class="functiontext">Inter::Errors::quoted</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unable to locate symbol"</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">, </span><span class="identifier">eloc</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="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">) == </span><span class="constant">SOCKET_ISYMS</span><span class="plain">)</span>
<span class="functiontext">Inter::SymbolsTables::make_socket</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">S_to</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">S_to</span><span class="plain">);</span>
<span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain"> = </span><span class="identifier">NULL</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 Inter::SymbolsTables::equate is used in <a href="#SP9">&#167;9</a>, 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/iibf (<a href="3-iibf.html#SP1_5">&#167;1.5</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::equate_textual is used in 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::make_plug is used in 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::make_socket is used in 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::resolve_forward_references is used in 3/iitf (<a href="3-iitf.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::rfr_visitor appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. URL-style symbol names. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_URL_SYMBOL_NAME_DEPTH</span><span class="plain"> 512</span>
</pre>
<pre class="display">
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="functiontext">Inter::Tree::global_scope</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">) == </span><span class="character">'/'</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">at_P</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_package</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</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="character">'/'</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">at_P</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::by_name</span><span class="plain">(</span><span class="identifier">at_P</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at_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">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">at_P</span><span class="plain">), </span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">try</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">try</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">try</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">return</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">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">chain</span><span class="plain">[</span><span class="constant">MAX_URL_SYMBOL_NAME_DEPTH</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chain_length</span><span class="plain"> = 0;</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">-</span><span class="element">&gt;owning_package</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="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chain_length</span><span class="plain"> &gt;= </span><span class="constant">MAX_URL_SYMBOL_NAME_DEPTH</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"package nesting too deep"</span><span class="plain">);</span>
<span class="identifier">chain</span><span class="plain">[</span><span class="identifier">chain_length</span><span class="plain">++] = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::parent</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</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">=</span><span class="identifier">chain_length</span><span class="plain">-1; </span><span class="identifier">i</span><span class="plain">&gt;=0; </span><span class="identifier">i</span><span class="plain">--) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/%S"</span><span class="plain">, </span><span class="functiontext">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">chain</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::url_name_to_symbol is used in <a href="#SP10">&#167;10</a>, 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 2/trn (<a href="2-trn.html#SP3_2">&#167;3.2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_to_url_name is used in 2/sym (<a href="2-sym.html#SP2">&#167;2</a>, <a href="2-sym.html#SP4">&#167;4</a>), 2/trn (<a href="2-trn.html#SP3_2">&#167;3.2</a>, <a href="2-trn.html#SP4_1">&#167;4.1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-inl.html">Back to 'Inter Node Lists'</a></li><li><a href="2-pck.html">Continue with 'Packages'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>