1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-17 00:18:39 +03:00

Fixed cblorb bug (retrospectively) which manifested only in 64-bit C library

This commit is contained in:
Graham Nelson 2019-11-04 00:11:29 +00:00
parent 1a783023e2
commit a3fc704ee4
13 changed files with 137 additions and 56 deletions

View file

@ -389,10 +389,6 @@ useful for built-in meanings.
<span class="plain">The verb to substitute for means the built-in rule-substitutes-for meaning.</span>
<span class="plain">The verb to begin when means the built-in scene-begins-when meaning.</span>
<span class="plain">The verb to end when means the built-in scene-ends-when meaning.</span>
<span class="plain">The verb to end + when means the built-in scene-ends-when meaning.</span>
<span class="plain">The verb to do means the built-in rule-does-nothing meaning.</span>
<span class="plain">The verb to do + if means the built-in rule-does-nothing-if meaning.</span>
<span class="plain">The verb to do + when means the built-in rule-does-nothing-if meaning.</span>
@ -412,11 +408,7 @@ useful for built-in meanings.
<pre class="display">
<span class="plain">The verb to test + with in the imperative means the built-in test-with meaning.</span>
<span class="plain">The verb to understand + as in the imperative means the built-in understand-as meaning.</span>
<span class="plain">The verb to use in the imperative means the built-in use meaning.</span>
<span class="plain">The verb to release along with in the imperative means the built-in release-along-with meaning.</span>
<span class="plain">The verb to index map with in the imperative means the built-in index-map-with meaning.</span>
<span class="plain">The verb to include + in in the imperative means the built-in include-in meaning.</span>
<span class="plain">The verb to omit + from in the imperative means the built-in omit-from meaning.</span>
<span class="plain">The verb to document + at in the imperative means the built-in document-at meaning.</span>
@ -445,17 +437,10 @@ how they have effect.)
<pre class="display">
<span class="plain">Use American dialect translates as (- Constant DIALECT_US; -).</span>
<span class="plain">Use the serial comma translates as (- Constant SERIAL_COMMA; -).</span>
<span class="plain">Use full-length room descriptions translates as (- #IFNDEF I7_LOOKMODE; Constant I7_LOOKMODE = 2; #ENDIF; -).</span>
<span class="plain">Use abbreviated room descriptions translates as (- #IFNDEF I7_LOOKMODE; Constant I7_LOOKMODE = 3; #ENDIF; -).</span>
<span class="plain">Use memory economy translates as (- Constant MEMORY_ECONOMY; -).</span>
<span class="plain">Use authorial modesty translates as (- Constant AUTHORIAL_MODESTY; -).</span>
<span class="plain">Use scoring translates as (- #IFNDEF USE_SCORING; Constant USE_SCORING = 1; #ENDIF; -).</span>
<span class="plain">Use no scoring translates as (- #IFNDEF USE_SCORING; Constant USE_SCORING = 0; #ENDIF; -).</span>
<span class="plain">Use engineering notation translates as (- Constant USE_E_NOTATION = 0; -).</span>
<span class="plain">Use unabbreviated object names translates as (- Constant UNABBREVIATED_OBJECT_NAMES = 0; -).</span>
<span class="plain">Use command line echoing translates as (- Constant ECHO_COMMANDS; -).</span>
<span class="plain">Use manual pronouns translates as (- Constant MANUAL_PRONOUNS; -).</span>
<span class="plain">Use undo prevention translates as (- Constant PREVENT_UNDO; -).</span>
<span class="plain">Use predictable randomisation translates as (- Constant FIX_RNG; -).</span>
<span class="plain">Use fast route-finding translates as (- Constant FAST_ROUTE_FINDING; -).</span>
<span class="plain">Use slow route-finding translates as (- Constant SLOW_ROUTE_FINDING; -).</span>
@ -463,9 +448,6 @@ how they have effect.)
<span class="plain">Use telemetry recordings translates as (- Constant TELEMETRY_ON; -).</span>
<span class="plain">Use no deprecated features translates as (- Constant NO_DEPRECATED_FEATURES; -).</span>
<span class="plain">Use gn testing version translates as (- Constant GN_TESTING_VERSION; -).</span>
<span class="plain">Use VERBOSE room descriptions translates as (- Constant DEFAULT_VERBOSE_DESCRIPTIONS; -).</span>
<span class="plain">Use BRIEF room descriptions translates as (- Constant DEFAULT_BRIEF_DESCRIPTIONS; -).</span>
<span class="plain">Use SUPERBRIEF room descriptions translates as (- Constant DEFAULT_SUPERBRIEF_DESCRIPTIONS; -).</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -27,7 +27,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">bibliographic_datum_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">heading_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">phrase_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inference_array_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inference_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">property_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">property_permission_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">extension_file_MT</span>
@ -143,6 +143,7 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">i6_inclusion_matter</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">i6_memory_setting</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">implication</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inference</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inference_subject</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">instance</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">internal_test_case</span><span class="plain">)</span>
@ -201,7 +202,6 @@
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">application</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">extension_identifier_database_entry</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">inference</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">instance_usage</span><span class="plain">, 200)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">invocation_options</span><span class="plain">, 100)</span>
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain">, 100)</span>

View file

@ -95,6 +95,7 @@ organised as linked lists; hence the <code class="display"><span class="extract"
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">inferred_property_value</span><span class="plain">; </span> <span class="comment">and its value, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inference</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span> <span class="comment">next in list of inferences on same subject</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inference</span><span class="plain">;</span>
</pre>
@ -673,19 +674,30 @@ same property but with different values.
<span class="definitionkeyword">define</span> <span class="constant">CI_DIFFER_IN_COPY_ONLY</span><span class="plain"> 7</span>
<span class="definitionkeyword">define</span> <span class="constant">CI_IDENTICAL</span><span class="plain"> 0</span>
</pre>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>There's a lot of crude conversion of pointers to integers here, but it doesn't
much matter what ordering is used so long as a definite and unchanging ordering
is used.
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>Funny story: until 2019, this routine ran by using pointer subtraction when
comparing, for example, the INFS references in the inferences, on the principle
that the ordering doesn't really matter so long as it is definite and stable
during a run. But in the late 2010s, desktop operating systems such as MacOS
Mojave began to randomize the address space of all executables, to make it
harder for attackers to exploit buffer overflow bugs. As a result, although
the following routine continued to make definite orderings, they would be
randomly different from one run to another. Inform's output remained
functionally correct, but the generated I6 code would subtly differ from
run to run. And so we instead now incur the cost of looking up allocation IDs,
and indeed of storing those for inference structures.
</p>
<p class="inwebparagraph">Pointer subtraction is, in any case, frowned on in all the best houses, so this
was probably a good thing.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">World::Inferences::compare_inferences</span><span class="plain">(</span><span class="reserved">inference</span><span class="plain"> *</span><span class="identifier">i1</span><span class="plain">, </span><span class="reserved">inference</span><span class="plain"> *</span><span class="identifier">i2</span><span class="plain">) {</span>
<span class="identifier">pointer_sized_int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i1</span><span class="plain"> == </span><span class="identifier">i2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_IDENTICAL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_EXISTENCE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_EXISTENCE</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;inference_type</span><span class="plain"> - </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;inference_type</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;inference_type</span><span class="plain"> - </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;inference_type</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_TYPE</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_TYPE</span><span class="plain">;</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">pr1</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;inferred_property</span><span class="plain">;</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;inferred_property</span><span class="plain">;</span>
@ -693,17 +705,17 @@ is used.
<span class="plain">(</span><span class="identifier">pr2</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Properties::is_either_or</span><span class="plain">(</span><span class="identifier">pr2</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">pr1</span><span class="plain"> == </span><span class="functiontext">Properties::EitherOr::get_negation</span><span class="plain">(</span><span class="identifier">pr2</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">pr2</span><span class="plain"> == </span><span class="functiontext">Properties::EitherOr::get_negation</span><span class="plain">(</span><span class="identifier">pr1</span><span class="plain">)))) </span><span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">pr1</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">pr1</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">pr2</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_property</span><span class="plain">(</span><span class="identifier">pr1</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_property</span><span class="plain">(</span><span class="identifier">pr2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_PROPERTY</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_PROPERTY</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;infs_ref2</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;infs_ref2</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_infs</span><span class="plain">(</span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;infs_ref2</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_infs</span><span class="plain">(</span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;infs_ref2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_INFS2</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_INFS2</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;infs_ref1</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;infs_ref1</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_infs</span><span class="plain">(</span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;infs_ref1</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_infs</span><span class="plain">(</span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;infs_ref1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_INFS1</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_INFS1</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;spec_ref2</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;spec_ref2</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_pn</span><span class="plain">(</span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;spec_ref2</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_pn</span><span class="plain">(</span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;spec_ref2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_INFS2</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_INFS2</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;spec_ref1</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;spec_ref1</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_pn</span><span class="plain">(</span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;spec_ref1</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_pn</span><span class="plain">(</span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;spec_ref1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_DIFFER_IN_INFS1</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> -</span><span class="constant">CI_DIFFER_IN_INFS1</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i1</span><span class="plain">) - ((</span><span class="identifier">pointer_sized_int</span><span class="plain">) </span><span class="identifier">i2</span><span class="plain">);</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">World::Inferences::measure_inf</span><span class="plain">(</span><span class="identifier">i1</span><span class="plain">) - </span><span class="functiontext">World::Inferences::measure_inf</span><span class="plain">(</span><span class="identifier">i2</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;inferred_property_value</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;inferred_property_value</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i1</span><span class="plain">-</span><span class="element">&gt;inferred_property</span><span class="plain"> != </span><span class="identifier">i2</span><span class="plain">-</span><span class="element">&gt;inferred_property</span><span class="plain">) ||</span>
@ -715,6 +727,23 @@ is used.
<span class="reserved">return</span><span class="plain"> </span><span class="constant">CI_IDENTICAL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">World::Inferences::measure_property</span><span class="plain">(</span><span class="reserved">property</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">P</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1 + </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">World::Inferences::measure_inf</span><span class="plain">(</span><span class="reserved">inference</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1 + </span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">World::Inferences::measure_infs</span><span class="plain">(</span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">IS</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IS</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1 + </span><span class="identifier">IS</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">World::Inferences::measure_pn</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1 + </span><span class="identifier">N</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">infs_diversion</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">World::Inferences::diversion_on</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">infs_diversion</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
@ -741,6 +770,14 @@ is used.
<p class="endnote">The function World::Inferences::compare_inferences is used in <a href="#SP20">&#167;20</a>.</p>
<p class="endnote">The function World::Inferences::measure_property appears nowhere else.</p>
<p class="endnote">The function World::Inferences::measure_inf appears nowhere else.</p>
<p class="endnote">The function World::Inferences::measure_infs appears nowhere else.</p>
<p class="endnote">The function World::Inferences::measure_pn appears nowhere else.</p>
<p class="endnote">The function World::Inferences::diversion_on appears nowhere else.</p>
<p class="endnote">The function World::Inferences::diversion_off is used in 26/pc (<a href="26-pc.html#SP6">&#167;6</a>).</p>

View file

@ -352,9 +352,10 @@ copied in <code class="display"><span class="extract">text1</span></code>, <code
<span class="reserved">case</span><span class="plain"> </span><span class="constant">release_file_COMMAND</span><span class="plain">: {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to_release</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%f"</span><span class="plain">, </span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">to_release</span><span class="plain">));</span>
<span class="functiontext">Requests::request_3</span><span class="plain">(</span><span class="constant">COPY_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">to_release</span><span class="plain">));</span>
<span class="functiontext">Requests::request_3</span><span class="plain">(</span><span class="constant">COPY_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</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">release_file_from_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Requests::request_2</span><span class="plain">(</span><span class="constant">RELEASE_FILE_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>

View file

@ -180,12 +180,12 @@ remote.
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">units</span><span class="plain"> = </span><span class="string">"&amp;nbsp;bytes"</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">units</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"&amp;nbsp;bytes"</span><span class="plain">;</span>
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">remainder</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="string">"KB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="string">"MB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="string">"GB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="string">"TB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"KB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"MB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"GB"</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</span><span class="plain"> &gt; 1024</span><span class="identifier">L</span><span class="plain">) { </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain"> % 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">size</span><span class="plain"> /= 1024</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">units</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"TB"</span><span class="plain">; }</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">",&amp;nbsp;%d"</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">size</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">size</span><span class="plain"> &lt; 100</span><span class="identifier">L</span><span class="plain">) &amp;&amp; (</span><span class="identifier">remainder</span><span class="plain"> &gt;= 103</span><span class="identifier">L</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".%d"</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">remainder</span><span class="plain">/103</span><span class="identifier">L</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">units</span><span class="plain">);</span>

View file

@ -346,6 +346,7 @@ the template to add more if it wants to.
<pre class="displaydefn">
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"TEMPLATE"</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;details1</span><span class="plain">, 0);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"TEMPLATE"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"TEMPLATE is %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="functiontext">Templates::find_file_in_specific_template</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"style.css"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">) {</span>
@ -354,6 +355,7 @@ the template to add more if it wants to.
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Requests::release_file_into_website</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"TEMPLATE is %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="reserved">request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">request</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;private</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)</span>
@ -370,6 +372,7 @@ the template to add more if it wants to.
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">source_text</span><span class="plain">);</span>
<span class="functiontext">Requests::release_file_into_website</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"source.html"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"TEMPLATE is %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add further material as requested by the template</span> <span class="cwebmacronumber">6.9.1</span>&gt;<span class="plain">;</span>
</pre>

View file

@ -11,7 +11,7 @@
<!--Weave of 'S/prm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">srules 5/190315</a></li><li><b>Preamble</b></li></ul><p class="purpose">The titling line and rubric, use options and a few other technicalities before the Standard Rules get properly started.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Title</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Title</a></li><li><a href="#SP2">&#167;2. Verbs</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Title. </b>Every Inform 7 extension begins with a standard titling line and a
rubric text, and the Standard Rules are no exception:
@ -27,7 +27,56 @@ rubric text, and the Standard Rules are no exception:
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This setting is to do with the Inform parser's handling of multiple objects.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Verbs. </b>And now miscellaneous other important verbs. Note the plus notation, new
in May 2016, which marks for a second object phrase, and is thus only
useful for built-in meanings.
</p>
<pre class="display">
<span class="plain">The verb to begin when means the built-in scene-begins-when meaning.</span>
<span class="plain">The verb to end when means the built-in scene-ends-when meaning.</span>
<span class="plain">The verb to end + when means the built-in scene-ends-when meaning.</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Verbs used as imperatives: "Test ... with ...", for example.
</p>
<pre class="display">
<span class="plain">The verb to test + with in the imperative means the built-in test-with meaning.</span>
<span class="plain">The verb to understand + as in the imperative means the built-in understand-as meaning.</span>
<span class="plain">The verb to release along with in the imperative means the built-in release-along-with meaning.</span>
<span class="plain">The verb to index map with in the imperative means the built-in index-map-with meaning.</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We can now make definitions of miscellaneous options: none are used by default,
but all translate into I6 constant definitions if used. (These are constants
whose values are used in the I6 library or in the template layer, which is
how they have effect.)
</p>
<pre class="display">
<span class="plain">Use full-length room descriptions translates as (- #IFNDEF I7_LOOKMODE; Constant I7_LOOKMODE = 2; #ENDIF; -).</span>
<span class="plain">Use abbreviated room descriptions translates as (- #IFNDEF I7_LOOKMODE; Constant I7_LOOKMODE = 3; #ENDIF; -).</span>
<span class="plain">Use authorial modesty translates as (- Constant AUTHORIAL_MODESTY; -).</span>
<span class="plain">Use scoring translates as (- #IFNDEF USE_SCORING; Constant USE_SCORING = 1; #ENDIF; -).</span>
<span class="plain">Use no scoring translates as (- #IFNDEF USE_SCORING; Constant USE_SCORING = 0; #ENDIF; -).</span>
<span class="plain">Use manual pronouns translates as (- Constant MANUAL_PRONOUNS; -).</span>
<span class="plain">Use undo prevention translates as (- Constant PREVENT_UNDO; -).</span>
<span class="plain">Use VERBOSE room descriptions translates as (- Constant DEFAULT_VERBOSE_DESCRIPTIONS; -).</span>
<span class="plain">Use BRIEF room descriptions translates as (- Constant DEFAULT_BRIEF_DESCRIPTIONS; -).</span>
<span class="plain">Use SUPERBRIEF room descriptions translates as (- Constant DEFAULT_SUPERBRIEF_DESCRIPTIONS; -).</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>This setting is to do with the Inform parser's handling of multiple objects.
</p>
@ -40,7 +89,7 @@ rubric text, and the Standard Rules are no exception:
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>That's it for the verbs with special internal meanings.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>That's it for the verbs with special internal meanings.
</p>
@ -50,7 +99,7 @@ rubric text, and the Standard Rules are no exception:
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following block of declarations is actually written by <code class="display"><span class="extract">indoc</span></code> and
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The following block of declarations is actually written by <code class="display"><span class="extract">indoc</span></code> and
modified each time we alter the documentation. It's a dictionary of symbolic
names like <code class="display"><span class="extract">HEADINGS</span></code> to HTML page leafnames like <code class="display"><span class="extract">doc71</span></code>.
</p>

View file

@ -285,9 +285,10 @@ copied in |text1|, |num1|, ..., accordingly.
case release_file_COMMAND: {
filename *to_release = Filenames::from_text(text1);
TEMPORARY_TEXT(leaf);
WRITE_TO(leaf, "%f", Filenames::get_leafname(to_release));
Requests::request_3(COPY_REQ, text1, leaf, I"--", FALSE); break;
WRITE_TO(leaf, "%S", Filenames::get_leafname(to_release));
Requests::request_3(COPY_REQ, text1, leaf, I"--", FALSE);
DISCARD_TEXT(leaf);
break;
}
case release_file_from_COMMAND:
Requests::request_2(RELEASE_FILE_REQ, text1, text2, FALSE); break;

View file

@ -120,12 +120,12 @@ this will describe a 1-byte auxiliary file as "1 bytes", the contingency seems
remote.
@<Write a description of the rough file size@> =
char *units = "&nbsp;bytes";
text_stream *units = I"&nbsp;bytes";
long int remainder = 0;
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = "KB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = "MB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = "GB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = "TB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = I"KB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = I"MB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = I"GB"; }
if (size > 1024L) { remainder = size % 1024L; size /= 1024L; units = I"TB"; }
WRITE(",&nbsp;%d", (int) size);
if ((size < 100L) && (remainder >= 103L)) WRITE(".%d", (int) (remainder/103L));
WRITE("%S", units);

View file

@ -202,6 +202,7 @@ the template to add more if it wants to.
@<Create a website@> =
Placeholders::set_to(I"TEMPLATE", req->details1, 0);
text_stream *t = Placeholders::read(I"TEMPLATE");
WRITE_TO(STDERR, "TEMPLATE is %S\n", t);
if (use_css_code_styles) {
filename *from = Templates::find_file_in_specific_template(t, I"style.css");
if (from) {
@ -210,6 +211,7 @@ the template to add more if it wants to.
}
}
Requests::release_file_into_website(I"index.html", t, NULL);
WRITE_TO(STDERR, "TEMPLATE is %S\n", t);
request *req;
LOOP_OVER(req, request)
if (req->private == FALSE)
@ -226,6 +228,7 @@ the template to add more if it wants to.
DISCARD_TEXT(source_text);
Requests::release_file_into_website(I"source.html", t, NULL); break;
}
WRITE_TO(STDERR, "TEMPLATE is %S\n", t);
@<Add further material as requested by the template@>;
@ Most templates do not request extra files, but they have the option by

View file

@ -3228,8 +3228,10 @@ void set_placeholder_to_inner(char *var, char *text, int reservation, int extend
if (extend) L += cblorb_strlen(wv->pl_contents);
if (L >= MAX_FILENAME_LENGTH) { error("placeholder text too long"); return; }
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
if (wv->pl_contents != text) {
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
}
}
#line 146 "cBlorb/Chapter 3/Placeholders.w"

View file

@ -3228,8 +3228,10 @@ void set_placeholder_to_inner(char *var, char *text, int reservation, int extend
if (extend) L += cblorb_strlen(wv->pl_contents);
if (L >= MAX_FILENAME_LENGTH) { error("placeholder text too long"); return; }
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
if (wv->pl_contents != text) {
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
}
}
#line 146 "cBlorb/Chapter 3/Placeholders.w"

View file

@ -3268,9 +3268,10 @@ void set_placeholder_to_inner(char *var, char *text, int reservation, int extend
int L = cblorb_strlen(text) + 1;
if (extend) L += cblorb_strlen(wv->pl_contents);
if (L >= MAX_FILENAME_LENGTH) { error("placeholder text too long"); return; }
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
if (wv->pl_contents != text) {
if (extend) strcat(wv->pl_contents, text);
else strcpy(wv->pl_contents, text);
}
}
#line 146 "cBlorb/Chapter 3/Placeholders.w"