1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/26-uo.html
2019-09-07 20:43:31 +01:00

927 lines
116 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>26/i6i</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '26/uo' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#26">Chapter 26: Compilation Utilities</a></li><li><b>Use Options</b></li></ul><p class="purpose">To control compiler settings, pragma-style.</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>The preferred way to pass "do it this way, not that way" instructions to
Inform, in the spirit of natural-language input, is not to use command-line
arguments in the shell but to write suitable sentences in the source text.
For instance:
</p>
<blockquote>
<p>Use American dialect and the serial comma.</p>
</blockquote>
<p class="inwebparagraph">Use options like "American dialect" take the place of what would be switches
like <code class="display"><span class="extract">--american-dialect</span></code> in a conventional Unix tool. They are themselves
defined by the source text (almost always the Standard Rules). They generally
control run-time behaviour, and as a result Inform deals with them simply by
defining suitable I6 constants in the I6 code being output: conditional
compilation of the I6 template layer then delivers the desired result.
</p>
<p class="inwebparagraph">But a few use options are more analogous to compiler pragmas, changing how
Inform treats the rest of the source text. In some cases, they affect only
the source text file they come from &mdash; for example, so that an Extension can
set a use option applying only to itself.
</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">use_option</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">name</span><span class="plain">; </span> <span class="comment">word range where name is stored</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">option_expansion</span><span class="plain">; </span> <span class="comment">definition as given in source</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">where_used</span><span class="plain">; </span> <span class="comment">where the option is taken in the source</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">option_used</span><span class="plain">; </span> <span class="comment">set if this option has been taken</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">source_file_scoped</span><span class="plain">; </span> <span class="comment">scope is the current source file only?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">minimum_setting_value</span><span class="plain">; </span> <span class="comment">for those which are numeric</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">use_option</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure use_option is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/ts and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Five of the pragma-like settings are stored here:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">memory_economy_in_force</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dynamic_memory_allocation</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_engineering_notation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use_exact_parsing_option</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_figure_thumbnails</span><span class="plain"> = 50;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">undo_prevention</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">serial_comma</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">predictable_randomisation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">command_line_echoing</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">American_dialect</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">room_description_level</span><span class="plain"> = 2;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We can also meddle with the I6 memory settings which will be used to finish
compiling the story file. We need this because we have no practical way to
predict when our code will break I6's limits: the only reasonable way it can
work is for the user to hit the limit occasionally, and then raise that limit
by hand with a sentence in the source text.
</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">i6_memory_setting</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ICL_identifier</span><span class="plain">; </span> <span class="comment">see the DM4 for the I6 memory setting names</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number</span><span class="plain">; </span> <span class="comment">e.g., <code class="display"><span class="extract">50000</span></code> means "at least 50,000"</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">i6_memory_setting</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure i6_memory_setting is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Here first is the sentence handler for "Use ... means ..." sentences.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::use_translates_as_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[0]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"Use American dialect means ..."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">as</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">SW</span><span class="plain">)) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE1_SMFT</span><span class="plain">:</span>
<span class="functiontext">UseOptions::new_use_option</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::new_use_option</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">as</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">))) &amp;&amp;</span>
<span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">)))) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;, 1);</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">use_option</span><span class="plain">);</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="identifier">OW</span><span class="plain">;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_expansion</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; &gt; 0) </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> = -1;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">)) &amp;&amp; (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="constant">AUTHORIAL_MODESTY_UO</span><span class="plain">))</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_use_option</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::use_translates_as_SMF is used in 6/nv (<a href="6-nv.html#SP16">&#167;16</a>).</p>
<p class="endnote">The function UseOptions::new_use_option appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The object for such a sentence is just an I6 expansion:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">as</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="identifier">use</span><span class="plain"> &lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt; ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">as</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="plain">(- ### | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_UseTranslatesNotI6 problem</span> <span class="cwebmacronumber">6.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_UseTranslatesNotI6 problem</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UseTranslatesNotI6</span><span class="plain">),</span>
<span class="string">"that translates into something which isn't a simple I6 inclusion"</span><span class="plain">,</span>
<span class="string">"placed in '(-' and '-)' markers."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Having registered the use option names as miscellaneous, we need to parse
them back that way too:
</p>
<pre class="display">
<span class="reserved">use_option</span><span class="plain"> *</span><span class="functiontext">UseOptions::parse_uo</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">OW</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">K_use_option</span><span class="plain">)) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rvalues::to_use_option</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::parse_uo is used in <a href="#SP11_1">&#167;11.1</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>"Use" sentences are simple in structure. Their object noun phrases are
articled lists:
</p>
<blockquote>
<p>Use American dialect and the serial comma.</p>
</blockquote>
<p class="inwebparagraph">Each of the entries in this list must match the following; the text of the
option name is taken from the <code class="display"><span class="extract">...</span></code> or <code class="display"><span class="extract">###</span></code> as appropriate:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">of</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> </span><span class="identifier">least</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">-</span><span class="identifier">unlimited</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">### </span><span class="identifier">of</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">-</span><span class="identifier">unlimited</span><span class="plain">&gt; | ==&gt; -</span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; ... | ==&gt; 0</span>
<span class="plain">... ==&gt; 0</span>
<span class="plain">&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">inter</span><span class="plain">-</span><span class="identifier">pipeline</span><span class="plain">&gt; ::=</span>
<span class="identifier">inter</span><span class="plain"> </span><span class="identifier">pipeline</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt;} ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>These are use option names which Inform provides special support for; it
recognises the English names when they are defined by the Standard Rules. (So
there is no need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="identifier">authorial</span><span class="plain"> </span><span class="identifier">modesty</span><span class="plain"> |</span>
<span class="identifier">dynamic</span><span class="plain"> </span><span class="identifier">memory</span><span class="plain"> </span><span class="identifier">allocation</span><span class="plain"> |</span>
<span class="identifier">memory</span><span class="plain"> </span><span class="identifier">economy</span><span class="plain"> |</span>
<span class="identifier">no</span><span class="plain"> </span><span class="identifier">deprecated</span><span class="plain"> </span><span class="identifier">features</span><span class="plain"> |</span>
<span class="identifier">numbered</span><span class="plain"> </span><span class="identifier">rules</span><span class="plain"> |</span>
<span class="identifier">telemetry</span><span class="plain"> </span><span class="identifier">recordings</span><span class="plain"> |</span>
<span class="identifier">scoring</span><span class="plain"> |</span>
<span class="identifier">no</span><span class="plain"> </span><span class="identifier">scoring</span><span class="plain"> |</span>
<span class="identifier">engineering</span><span class="plain"> </span><span class="identifier">notation</span><span class="plain"> |</span>
<span class="identifier">unabbreviated</span><span class="plain"> </span><span class="identifier">object</span><span class="plain"> </span><span class="identifier">names</span><span class="plain"> |</span>
<span class="identifier">index</span><span class="plain"> </span><span class="identifier">figure</span><span class="plain"> </span><span class="identifier">thumbnails</span><span class="plain"> |</span>
<span class="identifier">gn</span><span class="plain"> </span><span class="identifier">testing</span><span class="plain"> </span><span class="identifier">version</span><span class="plain"> |</span>
<span class="identifier">undo</span><span class="plain"> </span><span class="identifier">prevention</span><span class="plain"> |</span>
<span class="identifier">serial</span><span class="plain"> </span><span class="identifier">comma</span><span class="plain"> |</span>
<span class="identifier">predictable</span><span class="plain"> </span><span class="identifier">randomisation</span><span class="plain"> |</span>
<span class="identifier">command</span><span class="plain"> </span><span class="identifier">line</span><span class="plain"> </span><span class="identifier">echoing</span><span class="plain"> |</span>
<span class="identifier">american</span><span class="plain"> </span><span class="identifier">dialect</span><span class="plain"> |</span>
<span class="identifier">full</span><span class="plain">-</span><span class="identifier">length</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> </span><span class="identifier">descriptions</span><span class="plain"> |</span>
<span class="identifier">abbreviated</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> </span><span class="identifier">descriptions</span><span class="plain"> |</span>
<span class="identifier">verbose</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> </span><span class="identifier">descriptions</span><span class="plain"> |</span>
<span class="identifier">brief</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> </span><span class="identifier">descriptions</span><span class="plain"> |</span>
<span class="identifier">superbrief</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> </span><span class="identifier">descriptions</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>And these correspond to:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">AUTHORIAL_MODESTY_UO</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">DYNAMIC_MEMORY_ALLOCATION_UO</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">MEMORY_ECONOMY_UO</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">NO_DEPRECATED_FEATURES_UO</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">NUMBERED_RULES_UO</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">TELEMETRY_RECORDING_UO</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">SCORING_UO</span><span class="plain"> 6</span>
<span class="definitionkeyword">define</span> <span class="constant">NO_SCORING_UO</span><span class="plain"> 7</span>
<span class="definitionkeyword">define</span> <span class="constant">ENGINEERING_NOTATION_UO</span><span class="plain"> 8</span>
<span class="definitionkeyword">define</span> <span class="constant">UNABBREVIATED_OBJECT_NAMES_UO</span><span class="plain"> 9</span>
<span class="definitionkeyword">define</span> <span class="constant">INDEX_FIGURE_THUMBNAILS_UO</span><span class="plain"> 10</span>
<span class="definitionkeyword">define</span> <span class="constant">GN_TESTING_VERSION_UO</span><span class="plain"> 11</span>
<span class="definitionkeyword">define</span> <span class="constant">UNDO_PREVENTION_UO</span><span class="plain"> 12</span>
<span class="definitionkeyword">define</span> <span class="constant">SERIAL_COMMA_UO</span><span class="plain"> 13</span>
<span class="definitionkeyword">define</span> <span class="constant">PREDICTABLE_RANDOMISATION_UO</span><span class="plain"> 14</span>
<span class="definitionkeyword">define</span> <span class="constant">COMMAND_LINE_ECHOING_UO</span><span class="plain"> 15</span>
<span class="definitionkeyword">define</span> <span class="constant">AMERICAN_DIALECT_UO</span><span class="plain"> 16</span>
<span class="definitionkeyword">define</span> <span class="constant">FULL_LENGTH_ROOM_DESCRIPTIONS_UO</span><span class="plain"> 17</span>
<span class="definitionkeyword">define</span> <span class="constant">ABBREVIATED_ROOM_DESCRIPTIONS_UO</span><span class="plain"> 18</span>
<span class="definitionkeyword">define</span> <span class="constant">VERBOSE_ROOM_DESCRIPTIONS_UO</span><span class="plain"> 19</span>
<span class="definitionkeyword">define</span> <span class="constant">BRIEF_ROOM_DESCRIPTIONS_UO</span><span class="plain"> 20</span>
<span class="definitionkeyword">define</span> <span class="constant">SUPERBRIEF_ROOM_DESCRIPTIONS_UO</span><span class="plain"> 21</span>
</pre>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::use_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"Use American dialect."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE1_SMFT</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE2_SMFT</span><span class="plain">:</span>
<span class="functiontext">UseOptions::set_use_options</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::handle_set_use_option</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="functiontext">UseOptions::set_use_options</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::set_use_options</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">AND_NT</span><span class="plain">) {</span>
<span class="functiontext">UseOptions::set_use_options</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">);</span>
<span class="functiontext">UseOptions::set_use_options</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">inter</span><span class="plain">-</span><span class="identifier">pipeline</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">))) </span>&lt;<span class="cwebmacro">Set the chain given in this word range</span> <span class="cwebmacronumber">11.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">))) </span>&lt;<span class="cwebmacro">Set the option given in this word range</span> <span class="cwebmacronumber">11.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Used: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnknownUseOption</span><span class="plain">),</span>
<span class="string">"that isn't a 'Use' option known to me"</span><span class="plain">,</span>
<span class="string">"and needs to be one of the ones listed in the documentation."</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::use_SMF is used in 6/nv (<a href="6-nv.html#SP16">&#167;16</a>), 7/ns (<a href="7-ns.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function UseOptions::handle_set_use_option appears nowhere else.</p>
<p class="endnote">The function UseOptions::set_use_options appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP11_1"></a><b>&#167;11.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Set the option given in this word range</span> <span class="cwebmacronumber">11.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">min_setting</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; &lt; 0) </span>&lt;<span class="cwebmacro">Deal with the case of an I6 memory setting</span> <span class="cwebmacronumber">11.1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; &gt; 0) </span><span class="identifier">min_setting</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;, 1);</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain"> = </span><span class="functiontext">UseOptions::parse_uo</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">) {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Adjust the minimum setting</span> <span class="cwebmacronumber">11.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) {</span>
<span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span> <span class="comment">that is, if used in the main source text</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">UseOptions::set_immediate_option_flags</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_2"></a><b>&#167;11.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Set the chain given in this word range</span> <span class="cwebmacronumber">11.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">inter</span><span class="plain">-</span><span class="identifier">pipeline</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="functiontext">CoreMain::set_inter_pipeline</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_1_1"></a><b>&#167;11.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Adjust the minimum setting</span> <span class="cwebmacronumber">11.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> == -1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">min_setting</span><span class="plain"> != -1)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UONotNumerical</span><span class="plain">),</span>
<span class="string">"that 'Use' option does not have a numerical setting"</span><span class="plain">,</span>
<span class="string">"but is either used or not used."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">min_setting</span><span class="plain"> &gt;= </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">)</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> = </span><span class="identifier">min_setting</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11_1">&#167;11.1</a>.</p>
<p class="inwebparagraph"><a id="SP11_1_2"></a><b>&#167;11.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the case of an I6 memory setting</span> <span class="cwebmacronumber">11.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = -&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;, </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">) &gt; 63) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadICLIdentifier</span><span class="plain">),</span>
<span class="string">"that is too long to be an ICL identifier"</span><span class="plain">,</span>
<span class="string">"so can't be the name of any I6 memory setting."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">i6_memory_setting</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ms</span><span class="plain">, </span><span class="reserved">i6_memory_setting</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;number</span><span class="plain"> &lt; </span><span class="identifier">n</span><span class="plain">) </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;number</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">ms</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">i6_memory_setting</span><span class="plain">);</span>
<span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">);</span>
<span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;number</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">new_identifier</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11_1">&#167;11.1</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>For the pragma-like UOs:
</p>
<pre class="display">
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo_being_set</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::set_immediate_option_flags</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">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">) {</span>
<span class="identifier">uo_being_set</span><span class="plain"> = </span><span class="identifier">uo</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::set_immediate_option_flags is used in <a href="#SP11_1">&#167;11.1</a>, 3/rst (<a href="3-rst.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Some use options need to acted on immediately &mdash; for instance, if they're
set in the "Options.txt" file and they affect how Inform parses subsequent
sentences. The following works through a list of use options, acting on
those which need immediate action.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">&gt; ::=</span>
<span class="plain">... | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">preform_lookahead_mode</span><span class="plain">; </span> <span class="comment">match only when looking ahead</span>
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; &lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; ::=</span>
<span class="plain">, </span><span class="identifier">_and</span><span class="plain"> &lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">&gt; |</span>
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">and</span><span class="plain"> &lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">&gt;</span>
<span class="plain">&lt;</span><span class="identifier">immediate</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">use</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Act on this use option immediately</span> <span class="cwebmacronumber">13.1</span>&gt;
<span class="plain">......</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Act on this use option immediately</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">[1]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">AUTHORIAL_MODESTY_UO</span><span class="plain">: {</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> =</span>
<span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span>
<span class="identifier">Lexer::file_of_origin</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">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Extensions::Files::set_general_authorial_modesty</span><span class="plain">();</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Extensions::Files::set_authorial_modesty</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DYNAMIC_MEMORY_ALLOCATION_UO</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo_being_set</span><span class="plain">) </span><span class="identifier">dynamic_memory_allocation</span><span class="plain"> = </span><span class="identifier">uo_being_set</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MEMORY_ECONOMY_UO</span><span class="plain">: </span><span class="identifier">memory_economy_in_force</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NO_DEPRECATED_FEATURES_UO</span><span class="plain">: </span><span class="identifier">no_deprecated_features</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NUMBERED_RULES_UO</span><span class="plain">: </span><span class="functiontext">Rules::set_numbered_rules</span><span class="plain">(); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TELEMETRY_RECORDING_UO</span><span class="plain">: </span><span class="identifier">telemetry_recording</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SCORING_UO</span><span class="plain">: </span><span class="identifier">scoring_option_set</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NO_SCORING_UO</span><span class="plain">: </span><span class="identifier">scoring_option_set</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ENGINEERING_NOTATION_UO</span><span class="plain">: </span><span class="identifier">allow_engineering_notation</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UNABBREVIATED_OBJECT_NAMES_UO</span><span class="plain">: </span><span class="identifier">use_exact_parsing_option</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INDEX_FIGURE_THUMBNAILS_UO</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo_being_set</span><span class="plain">) </span><span class="identifier">index_figure_thumbnails</span><span class="plain"> = </span><span class="identifier">uo_being_set</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">GN_TESTING_VERSION_UO</span><span class="plain">:</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UNDO_PREVENTION_UO</span><span class="plain">: </span><span class="identifier">undo_prevention</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SERIAL_COMMA_UO</span><span class="plain">: </span><span class="identifier">serial_comma</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PREDICTABLE_RANDOMISATION_UO</span><span class="plain">: </span><span class="identifier">predictable_randomisation</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COMMAND_LINE_ECHOING_UO</span><span class="plain">: </span><span class="identifier">command_line_echoing</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">AMERICAN_DIALECT_UO</span><span class="plain">: </span><span class="identifier">American_dialect</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FULL_LENGTH_ROOM_DESCRIPTIONS_UO</span><span class="plain">: </span><span class="identifier">room_description_level</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ABBREVIATED_ROOM_DESCRIPTIONS_UO</span><span class="plain">: </span><span class="identifier">room_description_level</span><span class="plain"> = 3; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VERBOSE_ROOM_DESCRIPTIONS_UO</span><span class="plain">: </span><span class="identifier">room_description_level</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BRIEF_ROOM_DESCRIPTIONS_UO</span><span class="plain">: </span><span class="identifier">room_description_level</span><span class="plain"> = 1; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SUPERBRIEF_ROOM_DESCRIPTIONS_UO</span><span class="plain">: </span><span class="identifier">room_description_level</span><span class="plain"> = 3; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>It's possible to configure the size of the memory allocation for the run-time
heap, on which strings, lists and stored actions sit; here's where the level
is read:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::get_dynamic_memory_allocation</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">dynamic_memory_allocation</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::get_dynamic_memory_allocation is used in 13/rsfk (<a href="13-rsfk.html#SP18_1">&#167;18.1</a>).</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>This keeps the Contents page of the index from exploding:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::get_index_figure_thumbnails</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">index_figure_thumbnails</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::get_index_figure_thumbnails appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>And this is what the rest of Inform calls to find out whether a particular
pragma is set:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain">)?(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain">)))):</span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">efo</span><span class="plain"> = (</span><span class="identifier">sf</span><span class="plain">)?(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">)):</span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sf</span><span class="plain">) &amp;&amp; (</span><span class="identifier">efo</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sf</span><span class="plain">) &amp;&amp; (</span><span class="identifier">efo</span><span class="plain"> == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::uo_set_from is used in <a href="#SP20">&#167;20</a>.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Most use options, though, take effect by causing a constant to be defined
in the I6 code, or more generally by inserting some I6.
</p>
<p class="inwebparagraph">(The flummery about memory economy is to take care of obscure bugs which
can occur if an attempt to release with an existing story file goes wrong
and problem messages must be issued.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::compile</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) || (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0)) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">UO</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="functiontext">TemplateFiles::interpret</span><span class="plain">(</span><span class="identifier">UO</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_expansion</span><span class="plain">)) + 1),</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">UO</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Emit::intervention</span><span class="plain">(</span><span class="identifier">EARLY_LINK_STAGE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">UO</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::compile is used in 1/mr (<a href="1-mr.html#SP4_11">&#167;4.11</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>I6 memory settings need to be issued as ICL commands at the top of the I6
source code: see the DM4 for details.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::compile_icl_commands</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Emit::pragma</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"-s"</span><span class="plain">);</span>
<span class="reserved">i6_memory_setting</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ms</span><span class="plain">, </span><span class="reserved">i6_memory_setting</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"MAX_LOCAL_VARIABLES"</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">VirtualMachines::allow_MAX_LOCAL_VARIABLES</span><span class="plain">() == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">, </span><span class="string">"$%S=%d"</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;ICL_identifier</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">-</span><span class="element">&gt;number</span><span class="plain">);</span>
<span class="functiontext">Emit::pragma</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">prag</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::compile_icl_commands is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>Now for indexing, where there's nothing much to see.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAIN_TEXT_UO_ORIGIN</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">OPTIONS_FILE_UO_ORIGIN</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTENSION_UO_ORIGIN</span><span class="plain"> 3</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"The following use options are in force:"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">MAIN_TEXT_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">OPTIONS_FILE_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">) </span><span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">EXTENSION_UO_ORIGIN</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">nt</span><span class="plain"> = 0;</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &lt; 0)) </span><span class="identifier">nt</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nt</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Whereas these are not in force:"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &lt; 0)) {</span>
&lt;<span class="cwebmacro">Write in the index line for a use option not taken</span> <span class="cwebmacronumber">19.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (--</span><span class="identifier">nt</span><span class="plain"> &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::index is used in 26/vm (<a href="26-vm.html#SP18">&#167;18</a>).</p>
<p class="inwebparagraph"><a id="SP19_1"></a><b>&#167;19.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write in the index line for a use option not taken</span> <span class="cwebmacronumber">19.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"style=\</span><span class="plain">"</span><span class="string">white-space:nowrap\</span><span class="plain">"</span><span class="string">;"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"Use %+W."</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;%+W"</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP19">&#167;19</a>.</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::index_options_in_force_from</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = 0;</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &lt; 0) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">++ == 0) </span>&lt;<span class="cwebmacro">Write in the use option subheading</span> <span class="cwebmacronumber">20.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write in the index line for a use option taken</span> <span class="cwebmacronumber">20.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;source_file_scoped</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) &amp;&amp; (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">UseOptions::uo_set_from</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">++ == 0) </span>&lt;<span class="cwebmacro">Write in the use option subheading</span> <span class="cwebmacronumber">20.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write in the index line for a use option taken</span> <span class="cwebmacronumber">20.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::index_options_in_force_from is used in <a href="#SP19">&#167;19</a>.</p>
<p class="inwebparagraph"><a id="SP20_1"></a><b>&#167;20.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write in the use option subheading</span> <span class="cwebmacronumber">20.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"808080"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Set from "</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MAIN_TEXT_UO_ORIGIN</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the source text"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPTIONS_FILE_UO_ORIGIN</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the Options.txt configuration file"</span><span class="plain">);</span>
<span class="identifier">Index::DocReferences::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"OPTIONSFILE"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXTENSION_UO_ORIGIN</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the extension "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;title_text</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">);</span>
<span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a> (twice).</p>
<p class="inwebparagraph"><a id="SP20_2"></a><b>&#167;20.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write in the index line for a use option taken</span> <span class="cwebmacronumber">20.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 3, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Use %+W"</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" of at least %d"</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain">) </span><span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;where_used</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"Use %+W of at least %d."</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, 2*(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain">));</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;Double this&lt;/i&gt;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP20">&#167;20</a> (twice).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>A relatively late addition to the design of use options was to make them
values at run-time, of the kind "use option". We need to provide two routines:
one to test them, one to print them.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::TestUseOption_routine</span><span class="plain">(</span><span class="reserved">void</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::find</span><span class="plain">(</span><span class="constant">NO_USE_OPTIONS_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">use_option</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Compile the TestUseOption routine</span> <span class="cwebmacronumber">21.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Compile the PrintUseOption routine</span> <span class="cwebmacronumber">21.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::TestUseOption_routine is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile the TestUseOption routine</span> <span class="cwebmacronumber">21.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTUSEOPTION_HL</span><span class="plain">));</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">UO_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"UO"</span><span class="plain">);</span>
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;option_used</span><span class="plain">) || (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt;= 0)) {</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">IF_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">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_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">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">UO_s</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">uo</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</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="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</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">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</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="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::rfalse</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="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_2"></a><b>&#167;21.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile the PrintUseOption routine</span> <span class="cwebmacronumber">21.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">K_use_option</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">inter_symbol</span><span class="plain"> *</span><span class="identifier">UO_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"UO"</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">SWITCH_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">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">UO_s</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</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="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</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">CASE_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">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">uo</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</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">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_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">N</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="string">"%W option"</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</span><span class="plain"> &gt; 0)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="string">" [%d]"</span><span class="plain">, </span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;minimum_setting_value</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">N</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">N</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="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</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="plain">}</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</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="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_verb_verb_exists</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">story_author_given</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ranking_table_given</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::no_verb_verb</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">no_verb_verb_exists</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::story_author_given</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">story_author_given</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::ranking_table_given</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">ranking_table_given</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">UseOptions::configure_template</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bitmap</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scoring_option_set</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">undo_prevention</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 2;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">serial_comma</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 4;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">predictable_randomisation</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 16;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">command_line_echoing</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 32;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_verb_verb_exists</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 64;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">American_dialect</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 128;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">story_author_given</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 256;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranking_table_given</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> += 512;</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TEMPLATE_CONFIGURATION_BITMAP_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TEMPLATE_CONFIGURATION_LOOKMODE_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">room_description_level</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function UseOptions::no_verb_verb appears nowhere else.</p>
<p class="endnote">The function UseOptions::story_author_given appears nowhere else.</p>
<p class="endnote">The function UseOptions::ranking_table_given appears nowhere else.</p>
<p class="endnote">The function UseOptions::configure_template is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-i6i.html">Back to 'Inform 6 Inclusions'</a></li><li><a href="26-lt.html">Continue with 'List Together'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>