mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
1045 lines
213 KiB
HTML
1045 lines
213 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Inter in Binary Files</title>
|
|
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
|
|
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body class="commentary-font">
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-assets/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../assertions-module/index.html">assertions</a></li>
|
|
<li><a href="../values-module/index.html">values</a></li>
|
|
<li><a href="../knowledge-module/index.html">knowledge</a></li>
|
|
<li><a href="../imperative-module/index.html">imperative</a></li>
|
|
<li><a href="../runtime-module/index.html">runtime</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">bytecode</span></a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../pipeline-module/index.html">pipeline</a></li>
|
|
<li><a href="../final-module/index.html">final</a></li>
|
|
</ul><h2>Services</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../calculus-module/index.html">calculus</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
<!--Weave of 'Inter in Binary Files' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inter Modules</a></li><li><a href="index.html">bytecode</a></li><li><a href="index.html#3">Chapter 3: Their Instructions</a></li><li><b>Inter in Binary Files</b></li></ul></div>
|
|
<p class="purpose">To read or write inter between memory and binary files.</p>
|
|
|
|
<ul class="toc"><li><a href="3-iibf.html#SP1">§1. Compression and the shibboleth</a></li><li><a href="3-iibf.html#SP9">§9. Reading and writing inter to binary</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Compression and the shibboleth. </b>(Not the name of a band.) A binary Inter file opens with an 20-byte uncompressed
|
|
header:
|
|
</p>
|
|
|
|
<ul class="items"><li>(a) The first four bytes store a big-endian 32-bit word. Its numerical value
|
|
is given by the <span class="extract"><span class="extract-syntax">INTER_SHIBBOLETH</span></span> constant, but in fact this is the same as
|
|
the ASCII encoding of the letters <span class="extract"><span class="extract-syntax">intr</span></span>.
|
|
</li><li>(b) The second four bytes are all 0. This enables us to distinguish a binary
|
|
Inter file from a random text file which just happens to begin with those letters.
|
|
</li><li>(c) Words 2, 3 and 4 are then the three numerical parts of the current Inter
|
|
specification's semantic version number. For example, if that were 5.2.4, then
|
|
these words would be 5, 2 and 4 respectively.
|
|
</li></ul>
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">INTER_SHIBBOLETH</span><span class="plain-syntax"> ((</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="constant-syntax">0x696E7472</span><span class="plain-syntax">)</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::test_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">verdict</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fh</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryFiles::open_for_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> ((</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">X</span><span class="plain-syntax"> != </span><span class="constant-syntax">INTER_SHIBBOLETH</span><span class="plain-syntax">)) </span><span class="identifier-syntax">verdict</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> ((</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">X</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)) </span><span class="identifier-syntax">verdict</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::close</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">verdict</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Once past the header, the data is a flat series of 32-bit values, but many
|
|
of those are in practice low values: small integers, ASCII character codes and
|
|
the like. Given the Inform GUI apps need to store quite a lot of precompiled
|
|
binary Inter files, we can reduce the app's footprint — by what turns out to be
|
|
about 14 MB — if we compress those files. We do this by writing each word as
|
|
a series of 1 to 5 bytes.
|
|
</p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The following scheme is used on every word after the header:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> VALUE ONE TO FIVE BYTES</span>
|
|
<span class="plain-syntax"> 00000000-0000007f 0xxxxxxx</span>
|
|
<span class="plain-syntax"> 00000080-00003fff 10xxxxxx xxxxxxxx</span>
|
|
<span class="plain-syntax"> 00004000-001fffff 110xxxxx xxxxxxxx xxxxxxxx</span>
|
|
<span class="plain-syntax"> 00200000-3fffffff 11111111 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx</span>
|
|
<span class="plain-syntax"> 40000000-4000001e 111xxxxx</span>
|
|
<span class="plain-syntax"> 4000001f-ffffffff 11111111 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx</span>
|
|
</pre>
|
|
<p class="commentary">This is a little like UTF-8, but because there is no need to synchronise from an
|
|
arbitrary mid-file position, we can be more economical with bits; and we then
|
|
also optimise for the range just above <span class="extract"><span class="extract-syntax">40000000</span></span> because this is <span class="extract"><span class="extract-syntax">SYMBOL_BASE_VAL</span></span>,
|
|
and means that references in Inter bytecode to symbols cluster there. See
|
|
<a href="2-st.html" class="internal">Symbols Tables</a>.
|
|
</p>
|
|
|
|
<p class="commentary">Measurement on the binary Inter form of BasicInformKit, compiled for the 32d
|
|
architecture, came out as follows in February 2022:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax">Words in 1 byte(s): 923439</span>
|
|
<span class="plain-syntax">Words in 2 byte(s): 81056</span>
|
|
<span class="plain-syntax">Words in 3 byte(s): 21939</span>
|
|
<span class="plain-syntax">Words in 5 byte(s): 17269</span>
|
|
<span class="plain-syntax">1043703 words, 1237713 bytes: compression 0.296472</span>
|
|
</pre>
|
|
<p class="commentary">That is, the compressed file is about 0.295 times the size of what it would be
|
|
if no compression were used. Other kits similarly produced 0.294220, 0.286038,
|
|
and so on: the ratio was fairly consistent. More could certainly be done (even
|
|
these compressed files reduce further if run through gzip), but it would be a
|
|
trade-off for complexity. At some point enough is good enough.
|
|
</p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Compressed data exists only in files: decompression happens as data is read
|
|
into memory, and compression happens as it is written to the file.
|
|
</p>
|
|
|
|
<p class="commentary">This is the decoder. It stores the 32-bit unsigned value read in <span class="extract"><span class="extract-syntax">result</span></span>,
|
|
and returns <span class="extract"><span class="extract-syntax">TRUE</span></span> if all went well; if a file system error, or end of file,
|
|
occurs, then it returns <span class="extract"><span class="extract-syntax">FALSE</span></span> and the contents of <span class="extract"><span class="extract-syntax">result</span></span> are undefined.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::read_word</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::read_word</span></span>:<br/><a href="3-iibf.html#SP5">§5</a>, <a href="3-iibf.html#SP9_1_2">§9.1.2</a>, <a href="3-iibf.html#SP9_1_3_2_2">§9.1.3.2.2</a>, <a href="3-iibf.html#SP9_1_4">§9.1.4</a>, <a href="3-iibf.html#SP9_1_5">§9.1.5</a>, <a href="3-iibf.html#SP9_1_5_2">§9.1.5.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">), </span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">c4</span><span class="plain-syntax">, </span><span class="identifier-syntax">c5</span><span class="plain-syntax">; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> & </span><span class="constant-syntax">0xE0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="comment-syntax"> opening byte 000xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0x20</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 001xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0x40</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 010xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0x60</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 011xxxxx</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0x80</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 100xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0xa0</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 101xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> & </span><span class="constant-syntax">0x3f</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">) << </span><span class="constant-syntax">8</span><span class="plain-syntax">) + (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0xc0</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 110xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> & </span><span class="constant-syntax">0x1f</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c3</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">) << </span><span class="constant-syntax">16</span><span class="plain-syntax">) +</span>
|
|
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">) << </span><span class="constant-syntax">8</span><span class="plain-syntax">) + (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c3</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0xe0</span><span class="identifier-syntax">:</span><span class="plain-syntax"> </span><span class="comment-syntax"> opening byte 111xxxxx</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> != </span><span class="constant-syntax">0xff</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x40000000</span><span class="plain-syntax"> + (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> & </span><span class="constant-syntax">0x1f</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c3</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c4</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c5</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c5</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">) << </span><span class="constant-syntax">24</span><span class="plain-syntax">) +</span>
|
|
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c3</span><span class="plain-syntax">) << </span><span class="constant-syntax">16</span><span class="plain-syntax">) +</span>
|
|
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c4</span><span class="plain-syntax">) << </span><span class="constant-syntax">8</span><span class="plain-syntax">) + ((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c5</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And this version always returns a word:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::read_next</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::read_next</span></span>:<br/><a href="3-iibf.html#SP8">§8</a>, <a href="3-iibf.html#SP9_1_2">§9.1.2</a>, <a href="3-iibf.html#SP9_1_3">§9.1.3</a>, <a href="3-iibf.html#SP9_1_3_1">§9.1.3.1</a>, <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>, <a href="3-iibf.html#SP9_1_3_2_2">§9.1.3.2.2</a>, <a href="3-iibf.html#SP9_1_3_2_2_1">§9.1.3.2.2.1</a>, <a href="3-iibf.html#SP9_1_3_2_3">§9.1.3.2.3</a>, <a href="3-iibf.html#SP9_1_4">§9.1.4</a>, <a href="3-iibf.html#SP9_1_5_3">§9.1.5.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_error_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"binary Inter file incomplete"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>And this is the encoder. (Define the symbol <span class="extract"><span class="extract-syntax">MEASURE_INTER_COMPRESSION</span></span> to
|
|
see measurements like those above.) We return <span class="extract"><span class="extract-syntax">FALSE</span></span> if some file system error
|
|
occurred, making it impossible to write the data.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax">#</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[10] = { </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> };</span>
|
|
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::write_word</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::write_word</span></span>:<br/><a href="3-iibf.html#SP8">§8</a>, <a href="3-iibf.html#SP9_2_2">§9.2.2</a>, <a href="3-iibf.html#SP9_2_3">§9.2.3</a>, <a href="3-iibf.html#SP9_2_3_1">§9.2.3.1</a>, <a href="3-iibf.html#SP9_2_3_2">§9.2.3.2</a>, <a href="3-iibf.html#SP9_2_3_2_2">§9.2.3.2.2</a>, <a href="3-iibf.html#SP9_2_3_2_2_1">§9.2.3.2.2.1</a>, <a href="3-iibf.html#SP9_2_3_2_3">§9.2.3.2.3</a>, <a href="3-iibf.html#SP9_2_4">§9.2.4</a>, <a href="3-iibf.html#SP9_1_5_1_1">§9.1.5.1.1</a>, <a href="3-iibf.html#SP9_1_5_1_2">§9.1.5.1.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> < </span><span class="constant-syntax">0x80</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[1]++;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> < </span><span class="constant-syntax">0x4000</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[2]++;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x80</span><span class="plain-syntax"> + (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> < </span><span class="constant-syntax">0x200000</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[3]++;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0xc0</span><span class="plain-syntax"> + (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">16</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">8</span><span class="plain-syntax">) & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0x40000000</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> < </span><span class="constant-syntax">0x4000001f</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[1]++;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">((</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="constant-syntax">0xe0</span><span class="plain-syntax"> + </span><span class="identifier-syntax">val</span><span class="plain-syntax"> - </span><span class="constant-syntax">0x40000000</span><span class="plain-syntax">), </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[5]++;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0xff</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">24</span><span class="plain-syntax">) & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">16</span><span class="plain-syntax">) & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> >> </span><span class="constant-syntax">8</span><span class="plain-syntax">) & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c5</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> & </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c4</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c5</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::write_compression_statistics</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::write_compression_statistics</span></span>:<br/><a href="3-iibf.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MEASURE_INTER_COMPRESSION</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tot_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">tot_bytes</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><10; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Words in %d byte(s): %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tot_words</span><span class="plain-syntax"> += </span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tot_bytes</span><span class="plain-syntax"> += </span><span class="identifier-syntax">i</span><span class="plain-syntax">*</span><span class="identifier-syntax">Inter_words_with_byte_count</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%d words, %d bytes: compression %g\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tot_words</span><span class="plain-syntax">, </span><span class="identifier-syntax">tot_bytes</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> ((</span><span class="reserved-syntax">double</span><span class="plain-syntax">) </span><span class="identifier-syntax">tot_bytes</span><span class="plain-syntax">)/((</span><span class="reserved-syntax">double</span><span class="plain-syntax">) (4*</span><span class="identifier-syntax">tot_words</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>Conventionally, texts are stored as a sequence of words:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> 0 length word L (= 0 for the empty text)</span>
|
|
<span class="plain-syntax"> 1 first character</span>
|
|
<span class="plain-syntax"> ...</span>
|
|
<span class="plain-syntax"> L last character</span>
|
|
</pre>
|
|
<p class="commentary">So, note, this is not a C-style null terminated string.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::read_text</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::read_text</span></span>:<br/><a href="3-iibf.html#SP9_1_2">§9.1.2</a>, <a href="3-iibf.html#SP9_1_3_2_1">§9.1.3.2.1</a>, <a href="3-iibf.html#SP9_1_3_2_2">§9.1.3.2.2</a>, <a href="3-iibf.html#SP9_1_3_2_3">§9.1.3.2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_error_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">L</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, (</span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">c</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::write_text</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::write_text</span></span>:<br/><a href="3-iibf.html#SP9_2_2">§9.2.2</a>, <a href="3-iibf.html#SP9_2_3_2_1">§9.2.3.2.1</a>, <a href="3-iibf.html#SP9_2_3_2_2">§9.2.3.2.2</a>, <a href="3-iibf.html#SP9_2_3_2_3">§9.2.3.2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Reading and writing inter to binary. </b>So much for the encoding: now for the content, that is, what those words of
|
|
data actually are. The following functions to read and write binary Inter
|
|
files are presented in an interleaved way, showing each reader alongside its
|
|
corresponding writer.
|
|
</p>
|
|
|
|
<p class="commentary">Still, let's do the file-handling first:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::read</span><span class="plain-syntax">(</span><span class="reserved-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_FILE_READ</span><span class="plain-syntax">, </span><span class="string-syntax">"(Reading binary inter file %f)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_offset</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryFiles::size</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fh</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryFiles::open_for_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_error_location</span><span class="plain-syntax"> </span><span class="identifier-syntax">eloc</span><span class="plain-syntax"> = </span><a href="3-ie.html#SP1" class="function-link"><span class="function-syntax">Inter::Errors::interb_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_bookmark</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><a href="2-bkm.html#SP4" class="function-link"><span class="function-syntax">InterBookmark::at_start_of_this_repository</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_warehouse</span><span class="plain-syntax"> *</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax"> = </span><a href="2-it.html#SP3" class="function-link"><span class="function-syntax">InterTree::warehouse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> *</span><span class="identifier-syntax">grid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Read the content</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">Memory::I7_array_free</span><span class="plain-syntax">(</span><span class="identifier-syntax">grid</span><span class="plain-syntax">, </span><span class="constant-syntax">INTER_BYTECODE_MREASON</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Primitives::index_primitives_in_tree</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::close</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_FILE_READ</span><span class="plain-syntax">, </span><span class="string-syntax">"(Writing binary inter file %f)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fh</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryFiles::open_for_writing</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_warehouse</span><span class="plain-syntax"> *</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax"> = </span><a href="2-it.html#SP3" class="function-link"><span class="function-syntax">InterTree::warehouse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Write the content</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::close</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP7" class="function-link"><span class="function-syntax">Inter::Binary::write_compression_statistics</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>§9.1. </b>The file is organised in five blocks:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the content</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_1" class="named-paragraph-link"><span class="named-paragraph">Read the header</span><span class="named-paragraph-number">9.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_2" class="named-paragraph-link"><span class="named-paragraph">Read the annotations</span><span class="named-paragraph-number">9.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3" class="named-paragraph-link"><span class="named-paragraph">Read the resources</span><span class="named-paragraph-number">9.1.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_4" class="named-paragraph-link"><span class="named-paragraph">Read the symbol wirings</span><span class="named-paragraph-number">9.1.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5" class="named-paragraph-link"><span class="named-paragraph">Read the bytecode</span><span class="named-paragraph-number">9.1.5</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9">§9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>§9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the content</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_1" class="named-paragraph-link"><span class="named-paragraph">Write the header</span><span class="named-paragraph-number">9.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_2" class="named-paragraph-link"><span class="named-paragraph">Write the annotations</span><span class="named-paragraph-number">9.2.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3" class="named-paragraph-link"><span class="named-paragraph">Write the resources</span><span class="named-paragraph-number">9.2.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_4" class="named-paragraph-link"><span class="named-paragraph">Write the symbol wirings</span><span class="named-paragraph-number">9.2.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_5" class="named-paragraph-link"><span class="named-paragraph">Write the bytecode</span><span class="named-paragraph-number">9.2.5</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9">§9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_1" class="paragraph-anchor"></a><b>§9.1.1. </b>The header is uncompressed, so we call <span class="extract"><span class="extract-syntax">BinaryFiles::read_int32</span></span> and
|
|
<span class="extract"><span class="extract-syntax">BinaryFiles::write_int32</span></span> from <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the header</span><span class="named-paragraph-number">9.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> ((</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">X</span><span class="plain-syntax"> != </span><span class="constant-syntax">INTER_SHIBBOLETH</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> ((</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">X</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"not a binary inter file"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::close</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v3</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v1</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">BinaryFiles::read_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v3</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"header breaks off"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::close</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_version</span><span class="plain-syntax"> = </span><a href="1-tiv.html#SP2" class="function-link"><span class="function-syntax">InterVersion::from_three_words</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">v3</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="1-tiv.html#SP1" class="function-link"><span class="function-syntax">InterVersion::check_readable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">file_version</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_version</span><span class="plain-syntax"> = </span><a href="1-tiv.html#SP1" class="function-link"><span class="function-syntax">InterVersion::current</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">erm</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">erm</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"file '%f' holds Inter written for specification v%v, but I expect v%v"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, &</span><span class="identifier-syntax">file_version</span><span class="plain-syntax">, &</span><span class="identifier-syntax">current_version</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">erm</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">erm</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1">§9.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_1" class="paragraph-anchor"></a><b>§9.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the header</span><span class="named-paragraph-number">9.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="constant-syntax">INTER_SHIBBOLETH</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v3</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="1-tiv.html#SP2" class="function-link"><span class="function-syntax">InterVersion::to_three_words</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v3</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">v3</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2">§9.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_2" class="paragraph-anchor"></a><b>§9.1.2. </b>Next we have to describe the possible range of <a href="2-ann.html" class="internal">Annotations</a>. We need these
|
|
now, because they will be referred to in the symbol definitions in the
|
|
resource block later on.
|
|
</p>
|
|
|
|
<p class="commentary">This block is a sequence of records like so:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> Word Annotation ID</span>
|
|
<span class="plain-syntax"> Text Name</span>
|
|
<span class="plain-syntax"> Word Annotation type (a |*_IATYPE| value)</span>
|
|
</pre>
|
|
<p class="commentary">terminated by the sentinel word <span class="extract"><span class="extract-syntax">INVALID_IANN</span></span>. There cannot be two blocks with
|
|
the same annotation ID; the order of blocks is not meaningful. In particular,
|
|
they are not necessarily in increasing order of ID.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the annotations</span><span class="named-paragraph-number">9.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">ID</span><span class="plain-syntax"> = </span><span class="constant-syntax">INVALID_IANN</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">ID</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ID</span><span class="plain-syntax"> == </span><span class="constant-syntax">INVALID_IANN</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">keyword</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::read_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">keyword</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">iatype</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ann.html#SP2" class="function-link"><span class="function-syntax">SymbolAnnotation::declare</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ID</span><span class="plain-syntax">, </span><span class="identifier-syntax">keyword</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">iatype</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="string-syntax">"conflicting annotation name '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">keyword</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">keyword</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1">§9.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_2" class="paragraph-anchor"></a><b>§9.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the annotations</span><span class="named-paragraph-number">9.2.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_annotation_form</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IAF</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">IAF</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_annotation_form</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">IAF</span><span class="plain-syntax">-></span><span class="element-syntax">annotation_ID</span><span class="plain-syntax"> != </span><span class="constant-syntax">INVALID_IANN</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">IAF</span><span class="plain-syntax">-></span><span class="element-syntax">annotation_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::write_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">IAF</span><span class="plain-syntax">-></span><span class="element-syntax">annotation_keyword</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">IAF</span><span class="plain-syntax">-></span><span class="element-syntax">iatype</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="constant-syntax">INVALID_IANN</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2">§9.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3" class="paragraph-anchor"></a><b>§9.1.3. </b>There follows a block of resources. This consists of a single word giving
|
|
the count of the number of resources (which may be 0); then a table of warehouse
|
|
IDs; then a table of metadata for the resources.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the resources</span><span class="named-paragraph-number">9.1.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_1" class="named-paragraph-link"><span class="named-paragraph">Read the table of warehouse ID numbers</span><span class="named-paragraph-number">9.1.3.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Read the table of resources proper</span><span class="named-paragraph-number">9.1.3.2</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1">§9.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3" class="paragraph-anchor"></a><b>§9.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the resources</span><span class="named-paragraph-number">9.2.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_RESOURCE_IDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">) </span><span class="identifier-syntax">count</span><span class="plain-syntax">++;</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">count</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_1" class="named-paragraph-link"><span class="named-paragraph">Write the table of warehouse ID numbers</span><span class="named-paragraph-number">9.2.3.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2" class="named-paragraph-link"><span class="named-paragraph">Write the table of resources proper</span><span class="named-paragraph-number">9.2.3.2</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2">§9.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_1" class="paragraph-anchor"></a><b>§9.1.3.1. </b>A problem we must deal with is that the bytecode for the original tree will
|
|
have been full of references to texts, and such, by means of their warehouse ID
|
|
numbers. As we read in this data, we can and will mimic the texts that those
|
|
numbers were referring to: but we cannot expect them to have the same IDs in
|
|
our warehouse that they had in the original.
|
|
</p>
|
|
|
|
<p class="commentary">For example, suppose a tree contained the text <span class="extract"><span class="extract-syntax">"passacaglia"</span></span> at warehouse ID 34;
|
|
that this tree was then saved out as a binary Inter file; and that we are now
|
|
reading that binary file in. We can certainly make a text reading <span class="extract"><span class="extract-syntax">"passacaglia"</span></span>,
|
|
but there is no reason to expect (and no way to oblige) it to have warehouse ID 34
|
|
in our tree <span class="extract"><span class="extract-syntax">I</span></span>.
|
|
</p>
|
|
|
|
<p class="commentary">Because of that we will need to keep careful track of how IDs in the binary file
|
|
compare to those in our tree in memory. This is the purpose of the <span class="extract"><span class="extract-syntax">grid</span></span> array.
|
|
So, for example, <span class="extract"><span class="extract-syntax">grid[34]</span></span> is the ID for the string where our copy of
|
|
<span class="extract"><span class="extract-syntax">"passacaglia"</span></span> goes.
|
|
</p>
|
|
|
|
<p class="commentary">The grid is read in from a table whose first word is the maximum warehouse ID
|
|
ever used in the original file, plus 1; and then is a list of words giving
|
|
the warehouse IDs for the resources in turn.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the table of warehouse ID numbers</span><span class="named-paragraph-number">9.1.3.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">grid</span><span class="plain-syntax"> = (</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">Memory::calloc</span><span class="plain-syntax">((</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">INTER_BYTECODE_MREASON</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><a href="2-it.html#SP3" class="function-link"><span class="function-syntax">InterTree::global_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><a href="2-it.html#SP3" class="function-link"><span class="function-syntax">InterTree::root_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP4" class="function-link"><span class="function-syntax">InterWarehouse::create_resource</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> >= </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">-1;</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"max incorrect"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">original_ID</span><span class="plain-syntax">] = </span><span class="identifier-syntax">n</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3">§9.1.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_1" class="paragraph-anchor"></a><b>§9.2.3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the table of warehouse ID numbers</span><span class="named-paragraph-number">9.2.3.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">max</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_RESOURCE_IDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax">+1 > </span><span class="identifier-syntax">max</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">max</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">+1;</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">max</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_RESOURCE_IDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3">§9.2.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2" class="paragraph-anchor"></a><b>§9.1.3.2. </b>The table of resources is then a series of records, one for each resource.
|
|
Each record begins with a type word, which must be one of the <span class="extract"><span class="extract-syntax">*_IRSRC</span></span> values.
|
|
After that, the content (and record length) depends on the type.
|
|
</p>
|
|
|
|
<p class="commentary">The first two resources in this table are always:
|
|
</p>
|
|
|
|
<ul class="items"><li>(i) the symbols table for the root package, which holds global symbols such
|
|
as primitive names; and
|
|
</li><li>(ii) the root package itself.
|
|
</li></ul>
|
|
<p class="commentary">The sequence is otherwise not meaningful. It should not be assumed that
|
|
resources will be in increasing warehouse ID order.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the table of resources proper</span><span class="named-paragraph-number">9.1.3.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> >= </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"warehouse ID out of range"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">original_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">original_ID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2_1" class="named-paragraph-link"><span class="named-paragraph">Read a string resource</span><span class="named-paragraph-number">9.1.3.2.1</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SYMBOLS_TABLE_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2_2" class="named-paragraph-link"><span class="named-paragraph">Read a symbols table resource</span><span class="named-paragraph-number">9.1.3.2.2</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NODE_LIST_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2_4" class="named-paragraph-link"><span class="named-paragraph">Read a node list resource</span><span class="named-paragraph-number">9.1.3.2.4</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PACKAGE_REF_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2_3" class="named-paragraph-link"><span class="named-paragraph">Read a package resource</span><span class="named-paragraph-number">9.1.3.2.3</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"unknown resource type"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3">§9.1.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2" class="paragraph-anchor"></a><b>§9.2.3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the table of resources proper</span><span class="named-paragraph-number">9.2.3.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_RESOURCE_IDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">ID</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">RT</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP6" class="function-link"><span class="function-syntax">InterWarehouse::resource_type_code</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">RT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RT</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2_1" class="named-paragraph-link"><span class="named-paragraph">Write a string resource</span><span class="named-paragraph-number">9.2.3.2.1</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SYMBOLS_TABLE_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2_2" class="named-paragraph-link"><span class="named-paragraph">Write a symbols table resource</span><span class="named-paragraph-number">9.2.3.2.2</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PACKAGE_REF_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2_3" class="named-paragraph-link"><span class="named-paragraph">Write a package resource</span><span class="named-paragraph-number">9.2.3.2.3</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NODE_LIST_IRSRC:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2_4" class="named-paragraph-link"><span class="named-paragraph">Write a node list resource</span><span class="named-paragraph-number">9.2.3.2.4</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unimplemented resource type"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3">§9.2.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2_1" class="paragraph-anchor"></a><b>§9.1.3.2.1. </b>A text resource is <span class="extract"><span class="extract-syntax">TEXT_IRSRC</span></span> followed by a single text, giving its content.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read a string resource</span><span class="named-paragraph-number">9.1.3.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">txt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw.html#SP11" class="function-link"><span class="function-syntax">InterWarehouse::create_ref_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_text_stream</span><span class="plain-syntax">(</span><span class="identifier-syntax">txt</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::read_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">txt</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2_1" class="paragraph-anchor"></a><b>§9.2.3.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a string resource</span><span class="named-paragraph-number">9.2.3.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">txt</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP7" class="function-link"><span class="function-syntax">InterWarehouse::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::write_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">txt</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3_2">§9.2.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2_2" class="paragraph-anchor"></a><b>§9.1.3.2.2. </b>A symbols table resource is <span class="extract"><span class="extract-syntax">SYMBOLS_TABLE_IRSRC</span></span> followed by a list of records,
|
|
one for each symbol:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> word ID within the symbols table (always SYMBOL_BASE_VAL or greater, so nonzero)</span>
|
|
<span class="plain-syntax"> word symbol type (one of the |*_ISYMT| values)</span>
|
|
<span class="plain-syntax"> word persistent flags</span>
|
|
<span class="plain-syntax"> text identifier of the symbol</span>
|
|
<span class="plain-syntax"> table annotations table (see below)</span>
|
|
<span class="plain-syntax"> text text this symbol is wired to (if it is a plug: otherwise, omitted)</span>
|
|
</pre>
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read a symbols table resource</span><span class="named-paragraph-number">9.1.3.2.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tab</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tab</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tab</span><span class="plain-syntax"> = </span><a href="2-st.html#SP2" class="function-link"><span class="function-syntax">InterSymbolsTable::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw.html#SP11" class="function-link"><span class="function-syntax">InterWarehouse::create_ref_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_inter_symbols_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">tab</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">symbol_ID</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">symbol_ID</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol_ID</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">st</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">flags</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::read_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><a href="2-st.html#SP9" class="function-link"><span class="function-syntax">InterSymbolsTable::symbol_from_name_creating_at_ID</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tab</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-sym.html#SP5" class="function-link"><span class="function-syntax">InterSymbol::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">st</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-sym.html#SP7" class="function-link"><span class="function-syntax">InterSymbol::set_persistent_flags</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">flags</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_3_2_2_1" class="named-paragraph-link"><span class="named-paragraph">Read the annotations for a symbol</span><span class="named-paragraph-number">9.1.3.2.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sym.html#SP13" class="function-link"><span class="function-syntax">InterSymbol::is_plug</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::read_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw2.html#SP7" class="function-link"><span class="function-syntax">Wiring::wire_to_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_BINARY</span><span class="plain-syntax">, </span><span class="string-syntax">"Read symbol $3\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2_2" class="paragraph-anchor"></a><b>§9.2.3.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a symbols table resource</span><span class="named-paragraph-number">9.2.3.2.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_SYMBOLS_TABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="2-sym.html#SP5" class="function-link"><span class="function-syntax">InterSymbol::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="2-sym.html#SP7" class="function-link"><span class="function-syntax">InterSymbol::get_persistent_flags</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::write_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><a href="2-sym.html#SP19" class="function-link"><span class="function-syntax">InterSymbol::identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_2_3_2_2_1" class="named-paragraph-link"><span class="named-paragraph">Write the annotations for a symbol</span><span class="named-paragraph-number">9.2.3.2.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sym.html#SP13" class="function-link"><span class="function-syntax">InterSymbol::is_plug</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><a href="2-tw2.html#SP7" class="function-link"><span class="function-syntax">Wiring::wired_to_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::write_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3_2">§9.2.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2_2_1" class="paragraph-anchor"></a><b>§9.1.3.2.2.1. </b>The annotations table for a single symbol begins with a word in the form
|
|
<span class="extract"><span class="extract-syntax">(bm << 6) + n</span></span>, where <span class="extract"><span class="extract-syntax">bm</span></span> is the bitmap of its boolean annotations, and <span class="extract"><span class="extract-syntax">n</span></span>
|
|
is the number of non-boolean ones it has — which might be 0.
|
|
</p>
|
|
|
|
<p class="commentary">This word is then followed by <span class="extract"><span class="extract-syntax">n</span></span> pairs:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> word non-boolean annotation ID</span>
|
|
<span class="plain-syntax"> word non-boolean annotation value</span>
|
|
</pre>
|
|
<p class="commentary">The meaning of the value depends on the annotation type.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the annotations for a symbol</span><span class="named-paragraph-number">9.1.3.2.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bm</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">annotations</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_annotations</span><span class="plain-syntax"> |= (</span><span class="identifier-syntax">bm</span><span class="plain-syntax"> / </span><span class="constant-syntax">0x20</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bm</span><span class="plain-syntax"> & </span><span class="constant-syntax">0x1f</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">L</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_annotation</span><span class="plain-syntax"> </span><span class="identifier-syntax">IA</span><span class="plain-syntax"> = </span><a href="2-ann.html#SP9" class="function-link"><span class="function-syntax">SymbolAnnotation::from_pair</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ann.html#SP8" class="function-link"><span class="function-syntax">SymbolAnnotation::is_invalid</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"invalid annotation"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">IA</span><span class="plain-syntax">.</span><span class="element-syntax">annot</span><span class="plain-syntax">-></span><span class="identifier-syntax">iatype</span><span class="plain-syntax"> == </span><span class="constant-syntax">TEXTUAL_IATYPE</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">IA</span><span class="plain-syntax">.</span><span class="element-syntax">annot_value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">IA</span><span class="plain-syntax">.</span><span class="element-syntax">annot_value</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><a href="2-ann.html#SP6" class="function-link"><span class="function-syntax">SymbolAnnotation::set</span></a><span class="plain-syntax">(-1, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">IA</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3_2_2">§9.1.3.2.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2_2_1" class="paragraph-anchor"></a><b>§9.2.3.2.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the annotations for a symbol</span><span class="named-paragraph-number">9.2.3.2.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_annotation_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax"> = &(</span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">annotations</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">0x20</span><span class="plain-syntax">*((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">set</span><span class="plain-syntax">-></span><span class="element-syntax">boolean_annotations</span><span class="plain-syntax">) +</span>
|
|
<span class="plain-syntax"> (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-></span><span class="element-syntax">other_annotations</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">set</span><span class="plain-syntax">-></span><span class="element-syntax">other_annotations</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_annotation</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-></span><span class="element-syntax">other_annotations</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="2-ann.html#SP9" class="function-link"><span class="function-syntax">SymbolAnnotation::to_pair</span></a><span class="plain-syntax">(*</span><span class="identifier-syntax">A</span><span class="plain-syntax">, &</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">c2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3_2_2">§9.2.3.2.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2_3" class="paragraph-anchor"></a><b>§9.1.3.2.3. </b>A package resource is <span class="extract"><span class="extract-syntax">PACKAGE_REF_IRSRC</span></span> followed by:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> word warehouse ID of parent package, or 0 for the root package</span>
|
|
<span class="plain-syntax"> word persistent package flags</span>
|
|
<span class="plain-syntax"> word warehouse ID of symbols table</span>
|
|
<span class="plain-syntax"> text package name</span>
|
|
</pre>
|
|
<p class="commentary">The name isn't used much here, and it's arguably wasteful to store it: the
|
|
alternative would be to use some further flags marking the identity of certain
|
|
special packages (such as <span class="extract"><span class="extract-syntax">connectors</span></span>). But having the names of packages be
|
|
easy to determine from the binary Inter file seems no bad thing, and it doesn't
|
|
consume so very many extra bytes. Package names are short and compress well.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read a package resource</span><span class="named-paragraph-number">9.1.3.2.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">parent_package_resource_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">flags</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">symbols_table_resource_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parent</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">parent_package_resource_ID</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">parent_package_resource_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">parent_package_resource_ID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parent</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP9" class="function-link"><span class="function-syntax">InterWarehouse::get_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">parent_package_resource_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stored_package</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP9" class="function-link"><span class="function-syntax">InterWarehouse::get_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stored_package</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">stored_package</span><span class="plain-syntax"> = </span><a href="2-pck.html#SP3" class="function-link"><span class="function-syntax">InterPackage::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw.html#SP11" class="function-link"><span class="function-syntax">InterWarehouse::create_ref_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_inter_package</span><span class="plain-syntax">(</span><span class="identifier-syntax">stored_package</span><span class="plain-syntax">), </span><span class="identifier-syntax">stored_package</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="2-pck.html#SP13" class="function-link"><span class="function-syntax">InterPackage::set_persistent_flags</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stored_package</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">flags</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbols_table_resource_ID</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">symbols_table_resource_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">symbols_table_resource_ID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><a href="2-pck.html#SP8" class="function-link"><span class="function-syntax">InterPackage::set_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stored_package</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">symbols_table_resource_ID</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::read_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LargeScale::note_package_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">stored_package</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2_3" class="paragraph-anchor"></a><b>§9.2.3.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a package resource</span><span class="named-paragraph-number">9.2.3.2.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP9" class="function-link"><span class="function-syntax">InterWarehouse::get_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no package for warehouse ID"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">par</span><span class="plain-syntax"> = </span><a href="2-pck.html#SP5" class="function-link"><span class="function-syntax">InterPackage::parent</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">par</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">par</span><span class="plain-syntax">-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="2-pck.html#SP13" class="function-link"><span class="function-syntax">InterPackage::get_persistent_flags</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">package_scope</span><span class="plain-syntax">-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP8" class="function-link"><span class="function-syntax">Inter::Binary::write_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><a href="2-pck.html#SP7" class="function-link"><span class="function-syntax">InterPackage::name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">));</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3_2">§9.2.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_3_2_4" class="paragraph-anchor"></a><b>§9.1.3.2.4. </b>A node list resource consists only of the word <span class="extract"><span class="extract-syntax">NODE_LIST_IRSRC</span></span>, with no
|
|
further data. That's because node lists are built fresh as instructions are
|
|
read in. So on writing we need do nothing, and on reading, we only need to
|
|
create the empty node list.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read a node list resource</span><span class="named-paragraph-number">9.1.3.2.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tw.html#SP10" class="function-link"><span class="function-syntax">InterWarehouse::get_node_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw.html#SP11" class="function-link"><span class="function-syntax">InterWarehouse::create_ref_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_inter_node_list</span><span class="plain-syntax">(</span><a href="2-inl.html#SP1" class="function-link"><span class="function-syntax">InterNodeList::new</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_3_2_4" class="paragraph-anchor"></a><b>§9.2.3.2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a node list resource</span><span class="named-paragraph-number">9.2.3.2.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> ;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2_3_2">§9.2.3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_4" class="paragraph-anchor"></a><b>§9.1.4. </b>Now for the symbol wiring block. This has to be here, after all the symbols
|
|
tables and packages have been made, so that cross-references can be sorted out.
|
|
The block records all pairs <span class="extract"><span class="extract-syntax">S1</span></span> and <span class="extract"><span class="extract-syntax">S2</span></span> such that <span class="extract"><span class="extract-syntax">S1 ~~> S2</span></span>; note that it
|
|
does not record wirings to names, only wirings to symbols.
|
|
</p>
|
|
|
|
<p class="commentary">Rather than storing these pairs in no order, we group them by the origin table,
|
|
that is, by the symbols table holding <span class="extract"><span class="extract-syntax">S1</span></span>. So the block consists of one record
|
|
for each table which needs to make some wirings:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> word warehouse ID of symbols table holding S1</span>
|
|
<span class="plain-syntax"> table wirings in this table</span>
|
|
</pre>
|
|
<p class="commentary">This is terminated by a 0 word, which is safe since 0 is never a valid warehouse
|
|
ID: see <a href="2-tw.html" class="internal">The Warehouse</a>. The sub-table of wirings is then a sequence of these:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> word symbol ID in this table of S1</span>
|
|
<span class="plain-syntax"> word warehouse ID of symbols table holding S2</span>
|
|
<span class="plain-syntax"> word symbol ID in that table of S2</span>
|
|
</pre>
|
|
<p class="commentary">Again, this is null-terminated, which is safe since all symbol IDs are at least
|
|
<span class="extract"><span class="extract-syntax">SYMBOL_BASE_VAL</span></span>, a huge number.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the symbol wirings</span><span class="named-paragraph-number">9.1.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1_table</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">S1_table_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S1_table</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"invalid symbols table in wiring"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">S1_symbol_ID</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">S1_symbol_ID</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S1_symbol_ID</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">S2_table_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">S2_table_ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">S2_table_ID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">S2_symbol_ID</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2_table</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2_table_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S1_table</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"invalid symbols table in wiring"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax"> = </span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">InterSymbolsTable::symbol_from_ID</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1_table</span><span class="plain-syntax">, </span><span class="identifier-syntax">S1_symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</span><span class="plain-syntax"> = </span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">InterSymbolsTable::symbol_from_ID</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2_table</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2_symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">S1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">S2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"invalid symbols in wiring"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-tw2.html#SP5" class="function-link"><span class="function-syntax">Wiring::wire_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1">§9.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_4" class="paragraph-anchor"></a><b>§9.2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the symbol wirings</span><span class="named-paragraph-number">9.2.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_RESOURCE_IDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">ID</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from_T</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP8" class="function-link"><span class="function-syntax">InterWarehouse::get_symbols_table</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from_T</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">table_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_SYMBOLS_TABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_T</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tw2.html#SP2" class="function-link"><span class="function-syntax">Wiring::is_wired</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">table_needed</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">table_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="2-tw2.html#SP2" class="function-link"><span class="function-syntax">Wiring::wired_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">owning_table</span><span class="plain-syntax">-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">symbol_ID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">table_needed</span><span class="plain-syntax">) </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2">§9.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5" class="paragraph-anchor"></a><b>§9.1.5. </b>Finally the bytecode block. Surprisingly, this is easy to handle here, but
|
|
only because a non-trivial part of the process is handled elsewhere.
|
|
</p>
|
|
|
|
<p class="commentary">Note that this loop continues until the file runs out.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the bytecode</span><span class="named-paragraph-number">9.1.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">extent</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5_2" class="named-paragraph-link"><span class="named-paragraph">Read the preframe</span><span class="named-paragraph-number">9.1.5.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="2-in.html#SP2" class="function-link"><span class="function-syntax">Inode::new_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">extent</span><span class="plain-syntax">-1, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">owner</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5_3" class="named-paragraph-link"><span class="named-paragraph">Read the frame</span><span class="named-paragraph-number">9.1.5.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5_4" class="named-paragraph-link"><span class="named-paragraph">Correct and verify the frame</span><span class="named-paragraph-number">9.1.5.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="2-np.html#SP3" class="function-link"><span class="function-syntax">NodePlacement::move_to_moving_bookmark</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, &</span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1">§9.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2_5" class="paragraph-anchor"></a><b>§9.2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the bytecode</span><span class="named-paragraph-number">9.2.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><a href="2-it.html#SP7" class="function-link"><span class="function-syntax">InterTree::traverse_root_only</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-iibf.html#SP9_1_5_1" class="function-link"><span class="function-syntax">Inter::Binary::frame_writer</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">fh</span><span class="plain-syntax">, -</span><span class="constant-syntax">PACKAGE_IST</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-it.html#SP8" class="function-link"><span class="function-syntax">InterTree::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-iibf.html#SP9_1_5_1" class="function-link"><span class="function-syntax">Inter::Binary::frame_writer</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">fh</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_2">§9.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_1" class="paragraph-anchor"></a><b>§9.1.5.1. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::frame_writer</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::frame_writer</span></span>:<br/><a href="3-iibf.html#SP9_2_5">§9.2.5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fh</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">state</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5_1_1" class="named-paragraph-link"><span class="named-paragraph">Write the preframe</span><span class="named-paragraph-number">9.1.5.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-iibf.html#SP9_1_5_1_2" class="named-paragraph-link"><span class="named-paragraph">Write the frame</span><span class="named-paragraph-number">9.1.5.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_2" class="paragraph-anchor"></a><b>§9.1.5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the preframe</span><span class="named-paragraph-number">9.1.5.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">eloc</span><span class="plain-syntax">.</span><span class="element-syntax">error_offset</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">size_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">) - </span><span class="constant-syntax">PREFRAME_SIZE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">extent</span><span class="plain-syntax"> < </span><span class="constant-syntax">2</span><span class="plain-syntax">) || ((</span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">extent</span><span class="plain-syntax"> >= </span><span class="identifier-syntax">max_offset</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP10" class="function-link"><span class="function-syntax">Inter::Binary::read_error</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"wildly overlarge instruction frame"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">PID</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-iibf.html#SP4" class="function-link"><span class="function-syntax">Inter::Binary::read_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">PID</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">PID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">grid</span><span class="plain-syntax">[</span><span class="identifier-syntax">PID</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PID</span><span class="plain-syntax">) </span><span class="identifier-syntax">owner</span><span class="plain-syntax"> = </span><a href="2-tw.html#SP9" class="function-link"><span class="function-syntax">InterWarehouse::get_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">warehouse</span><span class="plain-syntax">, </span><span class="identifier-syntax">PID</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_5">§9.1.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_1_1" class="paragraph-anchor"></a><b>§9.1.5.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the preframe</span><span class="named-paragraph-number">9.1.5.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">W</span><span class="plain-syntax">.</span><span class="element-syntax">extent</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><a href="2-in.html#SP6" class="function-link"><span class="function-syntax">Inode::get_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">)-></span><span class="element-syntax">resource_ID</span><span class="plain-syntax">));</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_5_1">§9.1.5.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_3" class="paragraph-anchor"></a><b>§9.1.5.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the frame</span><span class="named-paragraph-number">9.1.5.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">extent</span><span class="plain-syntax">-1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">word</span><span class="plain-syntax"> = </span><a href="3-iibf.html#SP5" class="function-link"><span class="function-syntax">Inter::Binary::read_next</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, &</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="element-syntax">instruction</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">word</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_5">§9.1.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_1_2" class="paragraph-anchor"></a><b>§9.1.5.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the frame</span><span class="named-paragraph-number">9.1.5.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax"><P-></span><span class="element-syntax">W</span><span class="plain-syntax">.</span><span class="element-syntax">extent</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
|
<span class="plain-syntax"> </span><a href="3-iibf.html#SP6" class="function-link"><span class="function-syntax">Inter::Binary::write_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fh</span><span class="plain-syntax">, (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">W</span><span class="plain-syntax">.</span><span class="element-syntax">instruction</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]));</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_5_1">§9.1.5.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_1_5_4" class="paragraph-anchor"></a><b>§9.1.5.4. </b>That just leaves the process of correction. We do two things:
|
|
</p>
|
|
|
|
<ul class="items"><li>(a) Transposition: this means correcting all references to warehouse IDs in the
|
|
old tree into references to those in the new, by performing <span class="extract"><span class="extract-syntax">id = grid[id]</span></span>.
|
|
We cannot do this without knowing which words in the bytecode are warehouse IDs,
|
|
though, so we must call a method of the construct for the instruction.
|
|
</li><li>(b) Verification: also construct-specific, also done via a method call, this not
|
|
only performs sanity checks on the bytecode for the instruction but also
|
|
completes the process of embedding the instruction by, for example, setting
|
|
the definition of any symbol created in the instruction to <span class="extract"><span class="extract-syntax">P</span></span>.
|
|
</li></ul>
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Correct and verify the frame</span><span class="named-paragraph-number">9.1.5.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_error_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">grid</span><span class="plain-syntax">) </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="3-ic.html#SP15" class="function-link"><span class="function-syntax">InterConstruct::transpose_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">owner</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">grid</span><span class="plain-syntax">, </span><span class="identifier-syntax">grid_extent</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax">) { </span><a href="3-ie.html#SP1" class="function-link"><span class="function-syntax">Inter::Errors::issue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">); </span><span class="identifier-syntax">exit</span><span class="plain-syntax">(1); }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="3-ic.html#SP12" class="function-link"><span class="function-syntax">InterConstruct::verify_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">owner</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax">) { </span><a href="3-ie.html#SP1" class="function-link"><span class="function-syntax">Inter::Errors::issue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">); </span><span class="identifier-syntax">exit</span><span class="plain-syntax">(1); }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="3-iibf.html#SP9_1_5">§9.1.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Errors in reading binary inter are not recoverable:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inter::Binary::read_error</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Inter::Binary::read_error</span></span>:<br/><a href="3-iibf.html#SP5">§5</a>, <a href="3-iibf.html#SP9_1_1">§9.1.1</a>, <a href="3-iibf.html#SP9_1_2">§9.1.2</a>, <a href="3-iibf.html#SP9_1_3_1">§9.1.3.1</a>, <a href="3-iibf.html#SP9_1_3_2">§9.1.3.2</a>, <a href="3-iibf.html#SP9_1_3_2_2_1">§9.1.3.2.2.1</a>, <a href="3-iibf.html#SP9_1_4">§9.1.4</a>, <a href="3-iibf.html#SP9_1_5_2">§9.1.5.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_error_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eloc</span><span class="plain-syntax">, </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">eloc</span><span class="plain-syntax">-></span><span class="identifier-syntax">error_offset</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">size_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="3-ie.html#SP1" class="function-link"><span class="function-syntax">Inter::Errors::issue</span></a><span class="plain-syntax">(</span><a href="3-ie.html#SP1" class="function-link"><span class="function-syntax">Inter::Errors::plain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">eloc</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">exit</span><span class="plain-syntax">(1);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<nav role="progress"><div class="progresscontainer">
|
|
<ul class="progressbar"><li class="progressprev"><a href="3-ic.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresschapter"><a href="2-it.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ic.html">ic</a></li><li class="progresscurrent">iibf</li><li class="progresssection"><a href="3-iitf.html">iitf</a></li><li class="progresssection"><a href="3-vi.html">vi</a></li><li class="progresssection"><a href="3-idt.html">idt</a></li><li class="progresssection"><a href="3-mtd.html">mtd</a></li><li class="progresssection"><a href="3-ie.html">ie</a></li><li class="progresschapter"><a href="4-tnc.html">4</a></li><li class="progresschapter"><a href="5-tlc.html">5</a></li><li class="progresschapter"><a href="6-tpc.html">6</a></li><li class="progressnext"><a href="3-iitf.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|