1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/17-tl.html
2020-04-07 01:06:09 +01:00

586 lines
65 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>16/ic</title>
<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="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</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="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '17/tl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#17">Chapter 17: Text Data</a></li><li><b>Text Literals</b></li></ul><p class="purpose">In this section we compile text constants.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>It might not seem necessary to do much about literal text, since we're
compiling to what is already a high-enough level language to take care
of that for us &mdash; that is, it seems reasonable just to translate
</p>
<blockquote>
<p>say "Hello world."</p>
</blockquote>
<p class="inwebparagraph">straight into
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">print "Hello world.";</span></code>
</p>
<p class="inwebparagraph">The reason we don't do this is that we want string constants in the target
virtual machine to have addresses in alphabetical order; then a simple
unsigned comparison of packed addresses at run-time is equivalent to an
alphabetical comparison of the text. (We make great use of this when
sorting tables.) We can also ensure that two literal texts with the
same contents are numerically equal, rather than being compiled twice over
with two different addresses at which is stored duplicate data. So in fact
we compile constants such as:
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">Constant TX_L_14 "Hello world.";</span></code>
</p>
<p class="inwebparagraph">and then refer to them as:
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">print TX_L_14;</span></code>
</p>
<p class="inwebparagraph">To do this we need to store all of the string constants in such a way that
we can efficiently search and keep them in alphabetical order. We do this
with a red-black tree: a form of balanced binary tree structure such that
nodes appear in alphabetical order from left to right in the tree, but
which has a roughly equal depth throughout, so that the number of string
comparisons needed to search it is nearly the binary logarithm of the
number of nodes. For an account of the theory, see Sedgewick, "Algorithms"
(2nd edn, chap. 15). Each node in the tree is marked "red" or "black":
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">RED_NODE</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">BLACK_NODE</span><span class="plain"> </span><span class="constant">2</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The nodes in the tree will be instances of the following structure:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_text</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lt_position</span><span class="plain">; </span><span class="comment">position in the source of quoted text</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">as_boxed_quotation</span><span class="plain">; </span><span class="comment">formatted for the Inform 6 <code class="display"><span class="extract">box</span></code> statement</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bibliographic_conventions</span><span class="plain">; </span><span class="comment">mostly for apostrophes</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unescaped</span><span class="plain">; </span><span class="comment">completely so</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unexpanded</span><span class="plain">; </span><span class="comment">don't expand single quotes to double</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">node_colour</span><span class="plain">; </span><span class="comment">red or black: see above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">left_node</span><span class="plain">; </span><span class="comment">within their red-black tree</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">right_node</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">small_block_array_needed</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">lt_iname</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">lt_sba_iname</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">literal_text</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure literal_text is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The tree is always connected, with a single root node. The so-called Z node
is a special node representing a leaf with no contents, Z presumably standing
for zero.
</p>
<pre class="display">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">root_of_literal_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">z_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>There are two exceptions. One is that the empty text <code class="display"><span class="extract">""</span></code> is compiled to
a special value <code class="display"><span class="extract">EMPTY_TEXT_VALUE</span></code>, not to a <code class="display"><span class="extract">TX_L_*</span></code> constant, since we need
it always to be present whether or not it occurs in the source text as such.
</p>
<p class="inwebparagraph">The other is that Inform is sometimes compiling text not to its output code
but to a metadata file like the XML iFiction record instead, which takes a
more literal approach to literal text. So we can force it into a mode which
short-circuits the above mechanism:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">encode_constant_text_bibliographically</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="comment">Compile literal text semi-literally</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We are allowed to flag one text where ordinary apostrophe-to-double-quote
substitution doesn't occur: this is used for the title at the top of the
source text, and nothing else.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn_quote_suppressed</span><span class="plain"> = -1;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::suppress_quote_expansion</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="identifier">wn_quote_suppressed</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::suppress_quote_expansion appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The following creates a node; the word number is the location of the text
in the source.
</p>
<pre class="display">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="functiontext">Strings::TextLiterals::lt_new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">colour</span><span class="plain">) {</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">literal_text</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="identifier">colour</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain"> = </span><span class="identifier">w1</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">as_boxed_quotation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">bibliographic_conventions</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">unescaped</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">unexpanded</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">small_block_array_needed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="constant">LITERALS_HAP</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">TEXT_LITERAL_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_iname</span><span class="plain">, </span><span class="identifier">TEXT_LITERAL_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">wn_quote_suppressed</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">w1</span><span class="plain"> == </span><span class="identifier">wn_quote_suppressed</span><span class="plain">)) </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">unexpanded</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::lt_new is used in <a href="#SP10_1">&#167;10.1</a>, <a href="#SP10_2">&#167;10.2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And this utility compares the text at a given source position with the
contents of a node in the tree:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain">, </span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">), </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::lt_cmp is used in <a href="#SP10_2">&#167;10.2</a>, <a href="#SP10_2_2_1">&#167;10.2.2.1</a>, <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::mark_as_unescaped</span><span class="plain">(</span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">) </span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">unescaped</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::mark_as_unescaped is used in 17/rs (<a href="17-rs.html#SP12_1_2">&#167;12.1.2</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>That's it for the preliminaries.
</p>
<pre class="display">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">write</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">), </span><span class="identifier">L</span><span class="string">"\"\""</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">write</span><span class="plain">) &amp;&amp; (</span><span class="identifier">VH</span><span class="plain">)) </span><span class="functiontext">Emit::holster</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">EMPTY_TEXT_VALUE_HL</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">z_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Initialise the red-black tree</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Search for the text as a key in the red-black tree</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile_literal is used in <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>, <a href="#SP16">&#167;16</a>, 9/ma (<a href="9-ma.html#SP3_3_39_2">&#167;3.3.39.2</a>).</p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b>Note that the tree doesn't begin empty, but with a null node. Moreover,
the tree is always a strict binary tree in which every node always has two
children. One or both may be the Z node, and both children of Z are itself.
This sounds tricky, but minimises the number of comparisons needed to
check that branches are valid, the alternative being to allow some branches
which are null pointers.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the red-black tree</span> <span class="cwebmacronumber">10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">z_node</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::lt_new</span><span class="plain">(-1, </span><span class="constant">BLACK_NODE</span><span class="plain">); </span><span class="identifier">z_node</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">; </span><span class="identifier">z_node</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">;</span>
<span class="identifier">root_of_literal_text</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::lt_new</span><span class="plain">(-1, </span><span class="constant">BLACK_NODE</span><span class="plain">);</span>
<span class="identifier">root_of_literal_text</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">;</span>
<span class="identifier">root_of_literal_text</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_2"></a><b>&#167;10.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Search for the text as a key in the red-black tree</span> <span class="cwebmacronumber">10.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">root_of_literal_text</span><span class="plain">, *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">, *</span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">, *</span><span class="identifier">gg</span><span class="plain"> = </span><span class="identifier">g</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">went_left</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="comment">redundant assignment to appease <code class="display"><span class="extract">gcc -O2</span></code></span>
<span class="reserved">do</span><span class="plain"> {</span>
<span class="identifier">gg</span><span class="plain"> = </span><span class="identifier">g</span><span class="plain">; </span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sgn</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sgn</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span>&lt;<span class="cwebmacro">Locate this as the new node</span> <span class="cwebmacronumber">10.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sgn</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">went_left</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sgn</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">went_left</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> == </span><span class="constant">RED_NODE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> == </span><span class="constant">RED_NODE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Perform a split</span> <span class="cwebmacronumber">10.2.2</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">while</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> != </span><span class="identifier">z_node</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::lt_new</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="constant">RED_NODE</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">z_node</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">went_left</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">new_x</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform a split</span> <span class="cwebmacronumber">10.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">new_x</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Locate this as the new node</span> <span class="cwebmacronumber">10.2.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_2_1"></a><b>&#167;10.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Locate this as the new node</span> <span class="cwebmacronumber">10.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">encode_constant_text_bibliographically</span><span class="plain">) </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">bibliographic_conventions</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">write</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANTS_HAP</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANT_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VH</span><span class="plain">) </span><span class="functiontext">Emit::holster</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">small_block_array_needed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10_2">&#167;10.2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP10_2_2"></a><b>&#167;10.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform a split</span> <span class="cwebmacronumber">10.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">RED_NODE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">BLACK_NODE</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">BLACK_NODE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> == </span><span class="constant">RED_NODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Rotations will be needed</span> <span class="cwebmacronumber">10.2.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">root_of_literal_text</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">BLACK_NODE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10_2">&#167;10.2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP10_2_2_1"></a><b>&#167;10.2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Rotations will be needed</span> <span class="cwebmacronumber">10.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">g</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">RED_NODE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">left_of_g</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">left_of_p</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">g</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">left_of_g</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">left_of_p</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">left_of_g</span><span class="plain"> != </span><span class="identifier">left_of_p</span><span class="plain">) </span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::rotate</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">g</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::rotate</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">gg</span><span class="plain">);</span>
<span class="identifier">x</span><span class="plain">-&gt;</span><span class="element">node_colour</span><span class="plain"> = </span><span class="constant">BLACK_NODE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10_2_2">&#167;10.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Rotation is a local tree rearrangement which tends to move it towards
rather than away from "balance", that is, towards a configuration where
the depth of tree is roughly even.
</p>
<pre class="display">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="functiontext">Strings::TextLiterals::rotate</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain">, </span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">y</span><span class="plain">) {</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">c</span><span class="plain">, *</span><span class="identifier">gc</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">gc</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">; </span><span class="identifier">c</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">; </span><span class="identifier">gc</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">gc</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">; </span><span class="identifier">c</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">; </span><span class="identifier">gc</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Strings::TextLiterals::lt_cmp</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">y</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">gc</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::rotate is used in <a href="#SP10_2_2_1">&#167;10.2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>It's a little strange to be writing, in 2012, code to handle an idiosyncratic
one-off form of text called a "quotation", just to match an idiosyncratic
feature of Inform 1 from 1993 which was in turn matching an idiosyncratic
feature of version 4 of the Z-machine from 1985 which, in turn, existed only
to serve the needs of an unusual single work of IF called "Trinity".
But here we are. Boxed quotations are handled much like other literal
texts in that they enter the red-black tree, but they are marked out as
different for compilation purposes.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent_of_runtime_quotations_array</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="comment">start at 1 to avoid 0 length</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::compile_quotation</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">) </span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">as_boxed_quotation</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EmptyQuotationBox</span><span class="plain">),</span>
<span class="string">"a boxed quotation can't be empty"</span><span class="plain">,</span>
<span class="string">"though I suppose you could make it consist of just a few spaces "</span>
<span class="string">"to get a similar effect if you really needed to."</span><span class="plain">);</span>
<span class="identifier">extent_of_runtime_quotations_array</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::CCOUNT_QUOTATIONS</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">extent_of_runtime_quotations_array</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile_quotation is used in 17/rs (<a href="17-rs.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Strings::TextLiterals::CCOUNT_QUOTATIONS is used in 13/rsfk (<a href="13-rsfk.html#SP24">&#167;24</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>A version from fixed text:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::compile_literal_from_text</span><span class="plain">(</span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">context</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> *</span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> *</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
<span class="functiontext">Emit::to_ival_in_context</span><span class="plain">(</span><span class="identifier">context</span><span class="plain">, </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile_literal_from_text appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The above gradually piled up the need for <code class="display"><span class="extract">TX_L_*</span></code> constants/routines,
as compilation went on: now comes the reckoning, when we have to declare
all of these. We traverse the tree from left to right, because that produces
the texts in alphabetical order; the Z-node, of course, is a terminal and
shouldn't be visited, and the root node has no text (and so has word
number <code class="display"><span class="extract">-1</span></code>).
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::compile</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">root_of_literal_text</span><span class="plain">)</span>
<span class="functiontext">Strings::TextLiterals::traverse_lts</span><span class="plain">(</span><span class="identifier">root_of_literal_text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::traverse_lts</span><span class="plain">(</span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain"> != </span><span class="identifier">z_node</span><span class="plain">) </span><span class="functiontext">Strings::TextLiterals::traverse_lts</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">left_node</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">as_boxed_quotation</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Compile a standard literal text</span> <span class="cwebmacronumber">14.1</span>&gt;
<span class="reserved">else</span>
&lt;<span class="cwebmacro">Compile a boxed-quotation literal text</span> <span class="cwebmacronumber">14.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain"> != </span><span class="identifier">z_node</span><span class="plain">) </span><span class="functiontext">Strings::TextLiterals::traverse_lts</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">right_node</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile is used in 1/htc (<a href="1-htc.html#SP2_8">&#167;2.8</a>).</p>
<p class="endnote">The function Strings::TextLiterals::traverse_lts appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile a standard literal text</span> <span class="cwebmacronumber">14.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">()) { </span><span class="comment">to prevent trouble when no story file is really being made</span>
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_iname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TLT</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">options</span><span class="plain"> = </span><span class="constant">CT_DEQUOTE</span><span class="plain"> + </span><span class="constant">CT_EXPAND_APOSTROPHES</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">unescaped</span><span class="plain">) </span><span class="identifier">options</span><span class="plain"> = </span><span class="constant">CT_DEQUOTE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">bibliographic_conventions</span><span class="plain">)</span>
<span class="identifier">options</span><span class="plain"> += </span><span class="constant">CT_RECOGNISE_APOSTROPHE_SUBSTITUTION</span><span class="plain"> + </span><span class="constant">CT_RECOGNISE_UNICODE_SUBSTITUTION</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">unexpanded</span><span class="plain">) </span><span class="identifier">options</span><span class="plain"> = </span><span class="constant">CT_DEQUOTE</span><span class="plain">;</span>
<span class="functiontext">CompiledText::from_wide_string</span><span class="plain">(</span><span class="identifier">TLT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain">), </span><span class="identifier">options</span><span class="plain">);</span>
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_iname</span><span class="plain">, </span><span class="identifier">TLT</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TLT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">small_block_array_needed</span><span class="plain">) {</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">CONSTANT_PACKED_TEXT_STORAGE_HL</span><span class="plain">));</span>
<span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_iname</span><span class="plain">);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP14_2"></a><b>&#167;14.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile a boxed-quotation literal text</span> <span class="cwebmacronumber">14.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="constant">BOX_QUOTATIONS_HAP</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">BOX_QUOTATION_FN_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANTS_HAP</span><span class="plain">);</span>
<span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANT_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Emit::named_iname_constant</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_sba_iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">BOX_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="functiontext">CompiledText::bq_from_wide_string</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="element">lt_position</span><span class="plain">));</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Strings::TextLiterals::compile_small_block</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain">) {</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile_small_block appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b></p>
<pre class="display">
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="functiontext">Strings::TextLiterals::compile_literal_sb</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEST_COMPILATION_MODE</span><span class="plain">(</span><span class="constant">CONSTANT_CMODE</span><span class="plain">)) {</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANTS_HAP</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">BLOCK_CONSTANT_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_late_array_begin</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">lt</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">PACKED_TEXT_STORAGE_HL</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">EMPTY_TEXT_PACKED_HL</span><span class="plain">));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-&gt;</span><span class="identifier">lt_iname</span><span class="plain">);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">) </span><span class="functiontext">Emit::holster</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">lt</span><span class="plain"> = </span><span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lt</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Strings::TextLiterals::compile_literal_sb is used in 17/rs (<a href="17-rs.html#SP12_1_2">&#167;12.1.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 17: Text Data.)</i></li><li><a href="17-ts.html">Continue with 'Text Substitutions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>