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

654 lines
100 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/bkm</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/iibf' 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>Inter in Binary Files</b></li></ul><p class="purpose">To read or write inter between memory and binary files.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Reading and writing inter to binary</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Reading and writing inter to binary. </b>The binary representation of Inter, saved out to a file, is portable and
complete in itself.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Binary::read</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">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_FILE_READ</span><span class="plain">, </span><span class="string">"(Reading binary inter file %f)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_offset</span><span class="plain"> = </span><span class="identifier">BinaryFiles::size</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">fh</span><span class="plain"> = </span><span class="identifier">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="identifier">F</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::Errors::interb_location</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, 0);</span>
2019-07-14 12:44:07 +03:00
<span class="reserved">inter_bookmark</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> = </span><span class="functiontext">Inter::Bookmarks::at_start_of_this_repository</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">inter_warehouse</span><span class="plain"> *</span><span class="identifier">warehouse</span><span class="plain"> = </span><span class="functiontext">Inter::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> = 0;</span>
&lt;<span class="cwebmacro">Read the shibboleth</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the annotations</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the resources</span> <span class="cwebmacronumber">1.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the symbol equations</span> <span class="cwebmacronumber">1.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the bytecode</span> <span class="cwebmacronumber">1.7</span>&gt;<span class="plain">;</span>
<span class="identifier">BinaryFiles::close</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::Binary::read appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>Symmetrically:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Binary::write</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_FILE_READ</span><span class="plain">, </span><span class="string">"(Writing binary inter file %f)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">fh</span><span class="plain"> = </span><span class="identifier">BinaryFiles::open_for_writing</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">inter_warehouse</span><span class="plain"> *</span><span class="identifier">warehouse</span><span class="plain"> = </span><span class="functiontext">Inter::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
&lt;<span class="cwebmacro">Write the shibboleth</span> <span class="cwebmacronumber">1.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the annotations</span> <span class="cwebmacronumber">1.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the resources</span> <span class="cwebmacronumber">1.1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the symbol equations</span> <span class="cwebmacronumber">1.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the bytecode</span> <span class="cwebmacronumber">1.1.5</span>&gt;<span class="plain">;</span>
<span class="identifier">BinaryFiles::close</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::Binary::write appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b>The header is four bytes with a special value (equivalent to the ASCII
for <code class="display"><span class="extract">intr</span></code>), then four zero bytes, so that we can tell this file from a
text file coincidentally opening with those letters.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">INTER_SHIBBOLETH</span><span class="plain"> ((</span><span class="constant">inter_t</span><span class="plain">) 0</span><span class="identifier">x696E7472</span><span class="plain">)</span>
</pre>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the shibboleth</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">((</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">X</span><span class="plain"> != </span><span class="constant">INTER_SHIBBOLETH</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">((</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">X</span><span class="plain"> != 0)) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, 0, </span><span class="identifier">I</span><span class="string">"not a binary inter file"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_1"></a><b>&#167;1.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the shibboleth</span> <span class="cwebmacronumber">1.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="constant">INTER_SHIBBOLETH</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) 0);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3"></a><b>&#167;1.3. </b>Next we have to describe the possible range of annotations. We need these
now, because they will be referred to in the symbol definitions in the
resource block later on.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the annotations</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">ID</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="reserved">break</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">keyword</span><span class="plain">);</span>
<span class="reserved">unsigned</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">unsigned</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">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">keyword</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_annotation_form</span><span class="plain"> *</span><span class="identifier">IA</span><span class="plain"> = </span><span class="functiontext">Inter::Defn::create_annotation</span><span class="plain">(</span><span class="identifier">ID</span><span class="plain">, </span><span class="identifier">keyword</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IA</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"conflicting annotation name"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">keyword</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_2"></a><b>&#167;1.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the annotations</span> <span class="cwebmacronumber">1.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inter_annotation_form</span><span class="plain"> *</span><span class="identifier">IAF</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">IAF</span><span class="plain">, </span><span class="reserved">inter_annotation_form</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IAF</span><span class="plain">-</span><span class="element">&gt;annotation_ID</span><span class="plain"> == </span><span class="constant">INVALID_IANN</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="identifier">IAF</span><span class="plain">-</span><span class="element">&gt;annotation_ID</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">IAF</span><span class="plain">-</span><span class="element">&gt;annotation_keyword</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">IAF</span><span class="plain">-</span><span class="element">&gt;annotation_keyword</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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="plain">}</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4"></a><b>&#167;1.4. </b>There follows a block of resources, which is a list in which each entry opens
with a word identifying which resource is meant; when <code class="display"><span class="extract">NO_IRSRC</span></code> is reached,
that's the end of the list and therefore the block.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">NO_IRSRC</span><span class="definitionkeyword"> from </span><span class="constant">0</span>
<span class="definitionkeyword">enum</span> <span class="constant">STRING_IRSRC</span>
<span class="definitionkeyword">enum</span> <span class="constant">SYMBOLS_TABLE_IRSRC</span>
<span class="definitionkeyword">enum</span> <span class="constant">FRAME_LIST_IRSRC</span>
<span class="definitionkeyword">enum</span> <span class="constant">PACKAGE_IRSRC</span>
</pre>
<p class="inwebparagraph"><a id="SP1_5"></a><b>&#167;1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the resources</span> <span class="cwebmacronumber">1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">resource_counter</span><span class="plain"> = 0;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</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="constant">NO_IRSRC</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">resource_counter</span><span class="plain">++;</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">resource_counter</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">resource_counter</span><span class="plain"> &gt;= 3) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::create_resource</span><span class="plain">(</span><span class="identifier">warehouse</span><span class="plain">);</span>
<span class="reserved">inter_resource_holder</span><span class="plain"> *</span><span class="identifier">res</span><span class="plain"> = &amp;(</span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;stored_resources</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">STRING_IRSRC</span><span class="plain">: </span>&lt;<span class="cwebmacro">Read a string resource</span> <span class="cwebmacronumber">1.5.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SYMBOLS_TABLE_IRSRC</span><span class="plain">: </span>&lt;<span class="cwebmacro">Read a symbols table resource</span> <span class="cwebmacronumber">1.5.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FRAME_LIST_IRSRC</span><span class="plain">: </span>&lt;<span class="cwebmacro">Read a frame list resource</span> <span class="cwebmacronumber">1.5.4</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PACKAGE_IRSRC</span><span class="plain">: </span>&lt;<span class="cwebmacro">Read a package resource</span> <span class="cwebmacronumber">1.5.3</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3"></a><b>&#167;1.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the resources</span> <span class="cwebmacronumber">1.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</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">n</span><span class="plain"> &lt; </span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">++) {</span>
<span class="reserved">inter_resource_holder</span><span class="plain"> *</span><span class="identifier">res</span><span class="plain"> = &amp;(</span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;stored_resources</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_text_stream</span><span class="plain">) {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="constant">STRING_IRSRC</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write a string resource</span> <span class="cwebmacronumber">1.1.3.1</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain">) {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="constant">SYMBOLS_TABLE_IRSRC</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write a symbols table resource</span> <span class="cwebmacronumber">1.1.3.2</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">) {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="constant">PACKAGE_IRSRC</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write a package resource</span> <span class="cwebmacronumber">1.1.3.3</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="constant">FRAME_LIST_IRSRC</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write a frame list resource</span> <span class="cwebmacronumber">1.1.3.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="constant">NO_IRSRC</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1"></a><b>&#167;1.5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read a string resource</span> <span class="cwebmacronumber">1.5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_text_stream</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="reserved">unsigned</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">unsigned</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">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_text_stream</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5">&#167;1.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_1"></a><b>&#167;1.1.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write a string resource</span> <span class="cwebmacronumber">1.1.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_text_stream</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">res</span><span class="plain">-</span><span class="element">&gt;stored_text_stream</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_2"></a><b>&#167;1.5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read a symbols table resource</span> <span class="cwebmacronumber">1.5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::new</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">st</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">st</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sc</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">sc</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">unsigned</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">unsigned</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">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">trans</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">unsigned</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">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">trans</span><span class="plain">, (</span><span class="reserved">int</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">S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_creating_at_ID</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain">, </span><span class="identifier">name</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="element">&gt;symbol_type</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">st</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">sc</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">trans</span><span class="plain">) &gt; 0) </span><span class="functiontext">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">trans</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">unsigned</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">L</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"> &gt;= </span><span class="constant">MAX_INTER_ANNOTATIONS_PER_SYMBOL</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"excessive annotation"</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c1</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c2</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_annotation</span><span class="plain"> </span><span class="identifier">IA</span><span class="plain"> = </span><span class="functiontext">Inter::Defn::annotation_from_bytecode</span><span class="plain">(</span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Defn::is_invalid</span><span class="plain">(</span><span class="identifier">IA</span><span class="plain">)) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"invalid annotation"</span><span class="plain">);</span>
<span class="functiontext">Inter::Symbols::annotate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">IA</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">c</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_name</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="plain">}</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_BINARY</span><span class="plain">, </span><span class="string">"Read symbol $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">trans</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5">&#167;1.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_2"></a><b>&#167;1.1.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write a symbols table resource</span> <span class="cwebmacronumber">1.1.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</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">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">) {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_type</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_name</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">symb</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;translate_text</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">symb</span><span class="plain">-</span><span class="element">&gt;translate_text</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;no_symbol_annotations</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">symb</span><span class="plain">-</span><span class="element">&gt;no_symbol_annotations</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = 0, </span><span class="identifier">c2</span><span class="plain"> = 0;</span>
<span class="functiontext">Inter::Defn::annotation_to_bytecode</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_annotations</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], &amp;</span><span class="identifier">c1</span><span class="plain">, &amp;</span><span class="identifier">c2</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c1</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c2</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</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">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_3"></a><b>&#167;1.5.3. </b>And similarly for packages.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read a package resource</span> <span class="cwebmacronumber">1.5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</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">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">cl</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sc</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">sc</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">nid</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">nid</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">parent</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> != 0) </span><span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Inter::get_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::new</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cl</span><span class="plain">) </span><span class="functiontext">Inter::Packages::make_codelike</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nid</span><span class="plain"> == 0) </span><span class="functiontext">Inter::Packages::make_rootlike</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain"> != 0) </span><span class="functiontext">Inter::Packages::set_scope</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">, </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nid</span><span class="plain"> != 0) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">pack_name</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">parent</span><span class="plain">?(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">parent</span><span class="plain">)):</span><span class="functiontext">Inter::get_global_symbols</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">nid</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack_name</span><span class="plain">)</span>
2019-03-17 14:40:57 +02:00
<span class="functiontext">Inter::Packages::set_name</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">, </span><span class="identifier">pack_name</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"unable to retrieve package name"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5">&#167;1.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_3"></a><b>&#167;1.1.3.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write a package resource</span> <span class="cwebmacronumber">1.1.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_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="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">par</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>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">par</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">par</span><span class="plain">-</span><span class="element">&gt;index_n</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="functiontext">Inter::Packages::is_codelike</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;package_scope</span><span class="plain">-</span><span class="element">&gt;n_index</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="element">&gt;package_name</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_4"></a><b>&#167;1.5.4. </b>We do nothing here, because frame lists are built new on reading. It's
enough that the slot exists for the eventual list to be stored in.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read a frame list resource</span> <span class="cwebmacronumber">1.5.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_frame_list</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_frame_list</span><span class="plain"> = </span><span class="functiontext">Inter::new_frame_list</span><span class="plain">();</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5">&#167;1.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3_4"></a><b>&#167;1.1.3.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write a frame list resource</span> <span class="cwebmacronumber">1.1.3.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_3">&#167;1.1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_6"></a><b>&#167;1.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the symbol equations</span> <span class="cwebmacronumber">1.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">from_T</span><span class="plain"> = </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_T</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"It's %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no from_T"</span><span class="plain">);</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_ID</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">from_ID</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_ID</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_T_id</span><span class="plain"> = 0;</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_ID</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">to_T_id</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">to_ID</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">to_T</span><span class="plain"> = </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">to_T_id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_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 to_T"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">from_S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">from_T</span><span class="plain">, </span><span class="identifier">from_ID</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_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 from_S"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">to_S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">to_T</span><span class="plain">, </span><span class="identifier">to_ID</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to_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 to_S"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">from_S</span><span class="plain">, </span><span class="identifier">to_S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_4"></a><b>&#167;1.1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the symbol equations</span> <span class="cwebmacronumber">1.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</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">n</span><span class="plain"> &lt; </span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">++) {</span>
<span class="reserved">inter_resource_holder</span><span class="plain"> *</span><span class="identifier">res</span><span class="plain"> = &amp;(</span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;stored_resources</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain">) {</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">from_T</span><span class="plain"> = </span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_symbols_table</span><span class="plain">;</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">n</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">from_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">from_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_to</span><span class="plain">)) {</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">-</span><span class="element">&gt;n_index</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_7"></a><b>&#167;1.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the bytecode</span> <span class="cwebmacronumber">1.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">)) {</span>
<span class="identifier">eloc</span><span class="element">.error_offset</span><span class="plain"> = (</span><span class="identifier">size_t</span><span class="plain">) </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">) - </span><span class="constant">PREFRAME_SIZE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent</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">if</span><span class="plain"> ((</span><span class="identifier">extent</span><span class="plain"> &lt; 2) || ((</span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">extent</span><span class="plain"> &gt;= </span><span class="identifier">max_offset</span><span class="plain">)) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"overlarge line"</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="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">PID</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">PID</span><span class="plain">)) </span><span class="identifier">owner</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::from_PID</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">PID</span><span class="plain">);</span>
2019-07-23 02:13:47 +03:00
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::find_room</span><span class="plain">(</span><span class="identifier">warehouse</span><span class="plain">, </span><span class="functiontext">Inter::get_global_symbols</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">extent</span><span class="plain">-1, &amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">owner</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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">extent</span><span class="plain">-1; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">word</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">word</span><span class="plain">)) </span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">word</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">comment</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">comment</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">comment</span><span class="plain"> != 0) </span><span class="functiontext">Inter::Frame::attach_comment</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_error_message</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">) { </span><span class="functiontext">Inter::Errors::issue</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">); </span><span class="identifier">exit</span><span class="plain">(1); }</span>
<span class="functiontext">Inter::Frame::insert</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, &amp;</span><span class="identifier">at</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_5"></a><b>&#167;1.1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the bytecode</span> <span class="cwebmacronumber">1.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
2019-07-13 19:15:26 +03:00
<span class="functiontext">Inter::traverse_global_list</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Inter::Binary::visitor</span><span class="plain">, </span><span class="identifier">fh</span><span class="plain">, -</span><span class="constant">PACKAGE_IST</span><span class="plain">);</span>
<span class="functiontext">Inter::traverse_tree</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Inter::Binary::visitor</span><span class="plain">, </span><span class="identifier">fh</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Binary::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_frame</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">FILE</span><span class="plain"> *</span><span class="identifier">fh</span><span class="plain"> = (</span><span class="reserved">FILE</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">P</span><span class="element">.extent</span><span class="plain"> + 1));</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) (</span><span class="functiontext">Inter::Frame::get_package</span><span class="plain">(</span><span class="identifier">P</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">P</span><span class="element">.extent</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]));</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) (</span><span class="functiontext">Inter::Frame::get_comment</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)));</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_BINARY</span><span class="plain">, </span><span class="string">"Wrote %F\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, &amp;</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::Binary::visitor is used in <a href="#SP1_1_5">&#167;1.1.5</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Errors in reading binary inter are not recoverable:
2019-03-17 14:40:57 +02:00
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Binary::read_error</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">long</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">err</span><span class="plain">) {</span>
<span class="identifier">eloc</span><span class="plain">-</span><span class="element">&gt;error_offset</span><span class="plain"> = (</span><span class="identifier">size_t</span><span class="plain">) </span><span class="identifier">at</span><span class="plain">;</span>
<span class="functiontext">Inter::Errors::issue</span><span class="plain">(</span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">));</span>
<span class="identifier">exit</span><span class="plain">(1);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::Binary::read_error is used in <a href="#SP1_2">&#167;1.2</a>, <a href="#SP1_3">&#167;1.3</a>, <a href="#SP1_5_1">&#167;1.5.1</a>, <a href="#SP1_5_2">&#167;1.5.2</a>, <a href="#SP1_5_3">&#167;1.5.3</a>, <a href="#SP1_6">&#167;1.6</a>, <a href="#SP1_7">&#167;1.7</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>This tests a file to see if it looks like Inter binary:
2019-03-17 14:40:57 +02:00
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inter::Binary::test_file</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verdict</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">fh</span><span class="plain"> = </span><span class="identifier">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">((</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">X</span><span class="plain"> != </span><span class="constant">INTER_SHIBBOLETH</span><span class="plain">)) </span><span class="identifier">verdict</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">((</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">X</span><span class="plain"> != 0)) </span><span class="identifier">verdict</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">BinaryFiles::close</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">verdict</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::Binary::test_file appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-bkm.html">Back to 'Bookmarks'</a></li><li><a href="2-iitf.html">Continue with 'Inter in Text Files'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2019-03-17 14:40:57 +02:00
</body>
</html>