mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
1077 lines
121 KiB
HTML
1077 lines
121 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Headings</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">supervisor</span></a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Headings' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Headings</b></li></ul><p class="purpose">To keep track of the hierarchy of headings and subheadings found in the source text.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP8">§8. Declarations</a></li><li><a href="#SP11_2">§11.2. Parsing heading qualifiers</a></li><li><a href="#SP15">§15. The heading tree</a></li><li><a href="#SP17">§17. Verifying the heading tree</a></li><li><a href="#SP18">§18. Miscellaneous heading services</a></li><li><a href="#SP22">§22. Headings with extension dependencies</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>Headings in the source text correspond to <code class="display"><span class="extract">HEADING_NT</span></code> nodes in syntax
|
|
trees, and mostly occur when the user has explicitly typed a heading such as:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Part VII - The Ghost of the Aragon</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The sentence-breaker called <code class="display"><span class="extract">Headings::declare</span></code> each time it found one of
|
|
these, but also when a new source file started, because a file boundary is
|
|
construed as beginning with a hidden "heading" of a higher rank than any
|
|
other, and the sentence-breaker made a corresponding HEADING node there
|
|
too. This is important because the doctrine is that each heading starts
|
|
afresh with a new hierarchy of lower-order headings: thus changing the Part
|
|
means we can start again with Chapter 1 if we like, and so on. Because each
|
|
source file starts with an implicit super-heading, each source file gets
|
|
its own independent hierarchy of Volume, and so on. But the convention is
|
|
also important because we need to be able to say that every word loaded
|
|
from disc ultimately falls under some heading, even if the source text as
|
|
typed by the designer does not obviously have any headings in it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The hierarchy thus runs: File (0), Volume (1), Book (2), Part (3),
|
|
Chapter (4), Section (5). (The implementation in <code class="display"><span class="extract">imbuild</span></code> allows for even lower
|
|
levels of subheading, from 6 to 9, but Inform doesn't use them.) Every run
|
|
of Inform declares at least two File (0) headings, representing the start of
|
|
main text and the start of the Standard Rules, and these latter have a
|
|
couple of dozen headings themselves, so the typical number of headings
|
|
in a source text is 30 to 100.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">NO_HEADING_LEVELS</span><span class="plain"> </span><span class="constant">10</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Although it is implicit in the parse tree already, the heading structure
|
|
is not easy to deduce, and so in this section we build a much smaller tree
|
|
consisting just of the hierarchy of headings. The heading tree has nodes
|
|
made from the following structures:
|
|
</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">heading</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">sentence_declaring</span><span class="plain">; </span><span class="comment"> if any: file starts are undeclared</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">source_location</span><span class="plain"> </span><span class="identifier">start_location</span><span class="plain">; </span><span class="comment"> first word under this heading is here</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">; </span><span class="comment"> 0 for Volume (highest) to 5 for Section (lowest)</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">indentation</span><span class="plain">; </span><span class="comment"> in a hierarchical listing</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_definitions_made_under_this</span><span class="plain">; </span><span class="comment"> for instance, global variables made here?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">for_release</span><span class="plain">; </span><span class="comment"> include this material in a release version?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">omit_material</span><span class="plain">; </span><span class="comment"> if set, simply ignore all of this</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use_with_or_without</span><span class="plain">; </span><span class="comment"> if TRUE, use with the extension; if FALSE, without</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">for_use_with</span><span class="plain">; </span><span class="comment"> e.g. "for use with ... by ..."</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">in_place_of_text</span><span class="plain">; </span><span class="comment"> e.g. "in place of ... in ... by ..."</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">heading_text</span><span class="plain">; </span><span class="comment"> once provisos have been stripped away</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">list_of_contents</span><span class="plain">; </span><span class="comment"> tagged names defined under this</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">last_in_list_of_contents</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">parent_heading</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">child_heading</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">next_heading</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">heading</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure heading is accessed in 3/bs2 and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The headings and subheadings are formed into a tree in which each heading
|
|
contains its lesser-order headings. The pseudo-heading exists to be the root
|
|
of this tree; the entire text falls under it. It is not a real heading at all,
|
|
and has no "level" or "indentation" as such.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">heading</span><span class="plain"> </span><span class="identifier">pseudo_heading</span><span class="plain">; </span><span class="comment"> The entire source falls under this top-level heading</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>As an example, a sequence in the primary source text of (Chapter I, Book
|
|
Two, Section 5, Chapter I, Section 1, Chapter III) would be formed up into
|
|
the heading tree:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">(the pseudo-heading) level -1, indentation -1</span>
|
|
<span class="plain">(File: Standard Rules) level 0, indentation 0</span>
|
|
<span class="plain">...</span>
|
|
<span class="plain">(File: primary source text) level 0, indentation 0</span>
|
|
<span class="plain">Chapter I level 4, indentation 1</span>
|
|
<span class="plain">Book Two level 2, indentation 1</span>
|
|
<span class="plain">Section 5 level 5, indentation 2</span>
|
|
<span class="plain">Chapter I level 4, indentation 2</span>
|
|
<span class="plain">Section 1 level 5, indentation 3</span>
|
|
<span class="plain">Chapter III level 4, indentation 2</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">Note that the level of a heading is not the same thing as its depth in this
|
|
tree, which we call the "indentation", and there is no simple relationship
|
|
between the two numbers. Clearly we want to start at the left margin. If a
|
|
new heading is subordinate to its predecessor (i.e., has higher level),
|
|
we want to indent further, but by the least amount needed — a single tap step.
|
|
Adjacent equal-level headings are on a par with each other and should have
|
|
the same indentation. But when the new heading is lower level than its
|
|
predecessor (i.e., more important) then the indentation decreases to
|
|
match the last one equally important.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We can secure the last of those properties with a formal definition as
|
|
follows. The level \(\ell_n\) of a heading depends only on its wording (or
|
|
source file origin), but the indentation of the \(n\)th heading, \(i_n\),
|
|
depends on \((\ell_1, \ell_2, ..., \ell_n)\), the sequence of all levels so
|
|
far:
|
|
$$ i_n = i_m + 1 \qquad {\rm where}\qquad m = {\rm max} \lbrace j \mid 0\leq j < n, \ell_j < \ell_n \rbrace $$
|
|
where \(\ell_0 = i_0 = -1\), so that this set always contains 0 and is
|
|
therefore not empty. We deduce that
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) \(i_1 = 0\) and thereafter \(i_n \geq 0\), since \(\ell_n\) is never negative again,
|
|
</li></ul>
|
|
<ul class="items"><li>(b) if \(\ell_k = \ell_{k+1}\) then \(i_k = i_{k+1}\), since the set over which
|
|
the maximum is taken is the same,
|
|
</li></ul>
|
|
<ul class="items"><li>(c) if \(\ell_{k+1} > \ell_k\), a subheading of its predecessor, then
|
|
\(i_{k+1} = i_k + 1\), a single tab step outward.
|
|
</li></ul>
|
|
<p class="inwebparagraph">That establishes the other properties we wanted, and shows that \(i_n\) is
|
|
indeed the number of tab steps we should be determining.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that to calculate \(i_n\) we do not need the whole of \((\ell_1, ..., \ell_n)\):
|
|
we only need to remember the values of
|
|
$$ i_{m(K)},\qquad {\rm where}\qquad m(K) = {\rm max} \lbrace j \mid 0\leq j < n, \ell_j < K \rbrace $$
|
|
for each possible heading level \(K=0, 1, ..., 9\). This requires much less
|
|
storage: we call it the "last indentation above level \(K\)".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This leads to the following algorithm when looking at the headings in any
|
|
individual file of source text: at the top of file,
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">NO_HEADING_LEVELS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = -1;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">Then parse for headings (they have an easily recognised lexical form); each
|
|
time one is found, work out its <code class="display"><span class="extract">level</span></code> as 1, ..., 5 for Volume down to Section,
|
|
and call:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">find_indentation</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">ind</span><span class="plain"> = </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">level</span><span class="plain">] + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">level</span><span class="plain">+1; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">NO_HEADING_LEVELS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">ind</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ind</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">While this algorithm is trivially equivalent to finding the depth of a
|
|
heading in the tree which we are going to build anyway, it is worth noting
|
|
here for the benefit of anyone writing a tool to (let's say) typeset an
|
|
Inform source text with a table of contents, or provide a navigation
|
|
gadget in the user interface.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>The primary source text, and indeed the source text in the extensions,
|
|
can make whatever headings they like: no sequence is illegal. It is not
|
|
for Inform to decide on behalf of the author that it is eccentric to place
|
|
Section C before Section B, for instance. The author might be doing so
|
|
deliberately, to put the Chariot-race before the Baths, say; and the
|
|
indexing means that it will be very apparent to the author what the heading
|
|
structure currently is, so mistakes are unlikely to last long. This is a
|
|
classic case where Inform trying to be too clever would annoy more often
|
|
than assist.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></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">name_resolution_data</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_count</span><span class="plain">; </span><span class="comment"> used when tallying up objects under their headings</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">next_under_heading</span><span class="plain">; </span><span class="comment"> next in the list under that</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">search_score</span><span class="plain">; </span><span class="comment"> used when searching nametags to parse names</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">next_to_search</span><span class="plain">; </span><span class="comment"> similarly</span>
|
|
<span class="plain">} </span><span class="reserved">name_resolution_data</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure name_resolution_data is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></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">contents_entry</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">heading_entered</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">contents_entry</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">contents_entry</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure contents_entry is accessed in 6/inc, 7/ed, 7/ec and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Declarations. </b>The heading tree is constructed all at once, after most of the sentence-breaking
|
|
is done, but since a few sentences can in principle be added later, we watch
|
|
for the remote chance of further headings being added, by keeping the following
|
|
flag:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_tree_made_at_least_once</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>Now, then, the routine <code class="display"><span class="extract">Headings::declare</span></code> is called by the sentence-breaker
|
|
each time it constructs a new HEADING node. (Note that it is not called to
|
|
create the pseudo-heading, which does not come from a node.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">A level 0 heading has text (the first sentence which happens to be in the
|
|
new source file), but this has no significance other than its location,
|
|
and cannot contain information about releasing or about virtual machines.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="constant">NO_HEADING_LEVELS</span><span class="plain">], </span><span class="identifier">lial_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work_identified</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Headings::from_node<button class="popup" onclick="togglePopup('usagePopup318')">...<span class="popuptext" id="usagePopup318">Usage of <b>Headings::from_node</b>:<br><a href="#SP24">§24</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ParseTree::get_embodying_heading</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">NEW_HEADING_HANDLER</span><span class="plain"> </span><span class="functiontext"><a href="#SP11">Headings::new_heading</a></span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Headings::new_heading<button class="popup" onclick="togglePopup('usagePopup319')">...<span class="popuptext" id="usagePopup319">Usage of <b>Headings::new_heading</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="functiontext"><a href="#SP11">Headings::declare</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">new</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="identifier">ParseTree::set_embodying_heading</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP18">Headings::include_material</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Headings::declare<button class="popup" onclick="togglePopup('usagePopup320')">...<span class="popuptext" id="usagePopup320">Usage of <b>Headings::declare</b>:<br>Project Services - <a href="5-ps2.html#SP5">§5</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">list_of_contents</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">last_in_list_of_contents</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">for_release</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">omit_material</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">index_definitions_made_under_this</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PN</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">))))</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"heading at textless node"</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">PN</span><span class="plain">) != </span><span class="identifier">HEADING_NT</span><span class="plain">)</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"declared a non-HEADING node as heading"</span><span class="plain">);</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">start_location</span><span class="plain"> = </span><span class="identifier">Wordings::location</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">));</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">, </span><span class="identifier">heading_level_ANNOT</span><span class="plain">);</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">heading_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) </span><<span class="cwebmacro">Parse heading text for release or other stipulations</span> <span class="cwebmacronumber">11.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> >= </span><span class="constant">NO_HEADING_LEVELS</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"impossible level"</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Determine the indentation from the level</span> <span class="cwebmacronumber">11.1</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">HEADINGS</span><span class="plain">, </span><span class="string">"Created heading $H\n"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">heading_tree_made_at_least_once</span><span class="plain">) </span><span class="functiontext"><a href="#SP15">Headings::make_tree</a></span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_1"></a><b>§11.1. </b>This implements the indentation algorithm described above.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Determine the indentation from the level</span> <span class="cwebmacronumber">11.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</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">lial_made</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">NO_HEADING_LEVELS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = -1;</span>
|
|
<span class="identifier">lial_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">indentation</span><span class="plain"> = </span><span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain">] + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">h</span><span class="plain">-></span><span class="identifier">level</span><span class="plain">+1; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">NO_HEADING_LEVELS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="identifier">last_indentation_above_level</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">h</span><span class="plain">-></span><span class="element">indentation</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2"></a><b>§11.2. Parsing heading qualifiers. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">PLATFORM_UNMET_HQ</span><span class="plain"> </span><span class="constant">0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">PLATFORM_MET_HQ</span><span class="plain"> </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">NOT_FOR_RELEASE_HQ</span><span class="plain"> </span><span class="constant">2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">FOR_RELEASE_ONLY_HQ</span><span class="plain"> </span><span class="constant">3</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">UNINDEXED_HQ</span><span class="plain"> </span><span class="constant">4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">USE_WITH_HQ</span><span class="plain"> </span><span class="constant">5</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">USE_WITHOUT_HQ</span><span class="plain"> </span><span class="constant">6</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">IN_PLACE_OF_HQ</span><span class="plain"> </span><span class="constant">7</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Parse heading text for release or other stipulations</span> <span class="cwebmacronumber">11.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (<</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>>) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PLATFORM_UNMET_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">omit_material</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="identifier">NOT_FOR_RELEASE_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_release</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="identifier">FOR_RELEASE_ONLY_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_release</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="identifier">UNINDEXED_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">index_definitions_made_under_this</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="identifier">USE_WITH_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</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="identifier">USE_WITHOUT_HQ:</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</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="identifier">IN_PLACE_OF_HQ:</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">heading_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain"> = </span><span class="identifier">work_identified</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">UnknownLanguageElement_SYNERROR</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">UnknownVirtualMachine_SYNERROR</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>When a heading has been found, we repeatedly try to match it against
|
|
<heading-qualifier> to see if it ends with text telling us what to do with
|
|
the source text it governs. For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Section 21 - Frogs (unindexed) (not for Glulx)</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">would match twice, first registering the VM requirement, then the unindexedness.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It's an unfortunate historical quirk that the unbracketed qualifiers are
|
|
allowed; they should probably be withdrawn.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( <</span><span class="identifier">bracketed</span><span class="plain">-</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ) | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain">... </span><span class="identifier">not</span><span class="plain"> </span><span class="reserved">for</span><span class="plain"> </span><span class="identifier">release</span><span class="plain"> | ==> </span><span class="constant">NOT_FOR_RELEASE_HQ</span>
|
|
<span class="plain">... </span><span class="reserved">for</span><span class="plain"> </span><span class="identifier">release</span><span class="plain"> </span><span class="identifier">only</span><span class="plain"> | ==> </span><span class="constant">FOR_RELEASE_ONLY_HQ</span>
|
|
<span class="plain">... </span><span class="identifier">unindexed</span><span class="plain"> ==> </span><span class="constant">UNINDEXED_HQ</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">bracketed</span><span class="plain">-</span><span class="reserved">heading</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ::=</span>
|
|
<span class="identifier">not</span><span class="plain"> </span><span class="reserved">for</span><span class="plain"> </span><span class="identifier">release</span><span class="plain"> | ==> </span><span class="constant">NOT_FOR_RELEASE_HQ</span>
|
|
<span class="reserved">for</span><span class="plain"> </span><span class="identifier">release</span><span class="plain"> </span><span class="identifier">only</span><span class="plain"> | ==> </span><span class="constant">FOR_RELEASE_ONLY_HQ</span>
|
|
<span class="identifier">unindexed</span><span class="plain"> | ==> </span><span class="constant">UNINDEXED_HQ</span>
|
|
<span class="plain"><</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ::=</span>
|
|
<span class="reserved">for</span><span class="plain"> <</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> </span><span class="identifier">only</span><span class="plain"> | ==> (</span><span class="identifier">R</span><span class="plain">[1])?</span><span class="identifier">PLATFORM_MET_HQ:PLATFORM_UNMET_HQ</span>
|
|
<span class="identifier">not</span><span class="plain"> </span><span class="reserved">for</span><span class="plain"> <</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> ==> (</span><span class="identifier">R</span><span class="plain">[1])?</span><span class="identifier">PLATFORM_UNMET_HQ:PLATFORM_MET_HQ</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">platform</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">language</span><span class="plain">-</span><span class="identifier">element</span><span class="plain">> </span><span class="identifier">language</span><span class="plain"> </span><span class="identifier">element</span><span class="plain"> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain">...... </span><span class="identifier">language</span><span class="plain"> </span><span class="identifier">element</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_UnknownLanguageElement problem</span> <span class="cwebmacronumber">13.1</span>>
|
|
<span class="plain"><</span><span class="identifier">current</span><span class="plain">-</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain">...... ==> </span><<span class="cwebmacro">Issue PM_UnknownVirtualMachine problem</span> <span class="cwebmacronumber">13.2</span>>
|
|
|
|
<span class="plain"><</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">qualifier</span><span class="plain">> ::=</span>
|
|
<span class="reserved">for</span><span class="plain"> </span><span class="identifier">use</span><span class="plain"> </span><span class="identifier">with</span><span class="plain"> <</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> | ==> </span><span class="constant">USE_WITH_HQ</span>
|
|
<span class="reserved">for</span><span class="plain"> </span><span class="identifier">use</span><span class="plain"> </span><span class="identifier">without</span><span class="plain"> <</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> | ==> </span><span class="constant">USE_WITHOUT_HQ</span>
|
|
<span class="identifier">not</span><span class="plain"> </span><span class="reserved">for</span><span class="plain"> </span><span class="identifier">use</span><span class="plain"> </span><span class="identifier">with</span><span class="plain"> <</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> | ==> </span><span class="constant">USE_WITHOUT_HQ</span>
|
|
<span class="identifier">in</span><span class="plain"> </span><span class="identifier">place</span><span class="plain"> </span><span class="identifier">of</span><span class="plain"> (<</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">>) </span><span class="identifier">in</span><span class="plain"> <</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> | ==> </span><span class="constant">IN_PLACE_OF_HQ</span>
|
|
<span class="identifier">in</span><span class="plain"> </span><span class="identifier">place</span><span class="plain"> </span><span class="identifier">of</span><span class="plain"> ...... </span><span class="identifier">in</span><span class="plain"> <</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> ==> </span><span class="constant">IN_PLACE_OF_HQ</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">> ::=</span>
|
|
<span class="plain">...... </span><span class="identifier">by</span><span class="plain"> ...... ==> </span><<span class="cwebmacro">Set for-use-with extension identifier</span> <span class="cwebmacronumber">13.3</span>>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13_1"></a><b>§13.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_UnknownLanguageElement problem</span> <span class="cwebmacronumber">13.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">UnknownLanguageElement_SYNERROR</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_node</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">sfsm_copy</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13_2"></a><b>§13.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_UnknownVirtualMachine problem</span> <span class="cwebmacronumber">13.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">UnknownVirtualMachine_SYNERROR</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_node</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">sfsm_copy</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13_3"></a><b>§13.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Set for-use-with extension identifier</span> <span class="cwebmacronumber">13.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[0] + </span><span class="constant">4</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">TW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">extension</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">>, </span><span class="constant">2</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">TW</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">);</span>
|
|
<span class="identifier">work_identified</span><span class="plain"> = </span><span class="functiontext"><a href="2-wrk.html#SP2">Works::new</a></span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">exft</span><span class="plain">, </span><span class="identifier">exfa</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-wrk.html#SP11">Works::add_to_database</a></span><span class="plain">(</span><span class="identifier">work_identified</span><span class="plain">, </span><span class="constant">USEWITH_WDBC</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exft</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">exfa</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">current</span><span class="plain">-</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">virtual</span><span class="plain">-</span><span class="identifier">machine</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">Compatibility::with</span><span class="plain">((</span><span class="identifier">compatibility_specification</span><span class="plain"> *) <<</span><span class="identifier">rp</span><span class="plain">>>, </span><span class="functiontext"><a href="1-ic.html#SP10">Inbuild::current_vm</a></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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</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="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. The heading tree. </b>The headings were constructed above as freestanding nodes (except that the
|
|
pseudo-heading already existed): here, we assemble them into a tree
|
|
structure. Because we want to be able to call this more than once, perhaps
|
|
to make revisions if late news comes in of a new heading (see above), we
|
|
begin by removing any existing relationships between the heading nodes.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::make_tree<button class="popup" onclick="togglePopup('usagePopup321')">...<span class="popuptext" id="usagePopup321">Usage of <b>Headings::make_tree</b>:<br><a href="#SP11">§11</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">15.1</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">15.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">15.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">heading_tree_made_at_least_once</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="#SP17">Headings::verify_heading_tree</a></span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_1"></a><b>§15.1. </b>Note that the loop over headings below loops through all those which were
|
|
created by the memory manager: which is to say, all of them except for the
|
|
pseudo-heading, which was explicitly placed in static memory above.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Reduce the whole heading tree to a pile of twigs</span> <span class="cwebmacronumber">15.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="identifier">pseudo_heading</span><span class="plain">.</span><span class="element">child_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">pseudo_heading</span><span class="plain">.</span><span class="element">parent_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">pseudo_heading</span><span class="plain">.</span><span class="element">next_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">) {</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">h</span><span class="plain">-></span><span class="element">next_heading</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">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_2"></a><b>§15.2. </b>The idea of the heading loop is that when we place a heading, we also place
|
|
subsequent headings of lesser or equal status until we cannot do so any longer.
|
|
That means that if we reach h and find that it has no parent, it must be
|
|
subordinate to no earlier heading: thus, it must be attached to the pseudo-heading
|
|
at the top of the tree.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">If h is outside the tree, make it a child of the pseudo-heading</span> <span class="cwebmacronumber">15.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP16">Headings::make_child_heading</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, &</span><span class="identifier">pseudo_heading</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_3"></a><b>§15.3. </b>Note that the following could be summed up as "move subsequent headings as
|
|
deep in the tree as we can see they need to be from h's perspective alone".
|
|
This isn't always the final position. For instance, given the sequence
|
|
Volume 1, Chapter I, Section A, Chapter II, the tree is adjusted twice:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">when h = Volume 1: then when h = Chapter I:</span>
|
|
<span class="plain">Volume 1 Volume 1</span>
|
|
<span class="plain">Chapter I Chapter I</span>
|
|
<span class="plain">Section A Section A</span>
|
|
<span class="plain">Chapter II Chapter II</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">since Section A is demoted twice, once by Volume 1, then by Chapter I.
|
|
(This algorithm would in principle be quadratic in the number of headings if
|
|
the possible depth of the tree were unbounded — every heading might have to
|
|
demote every one of its successors — but in fact because the depth is at
|
|
most 9, it runs in linear time.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Run through subsequent equal or subordinate headings to move them downward</span> <span class="cwebmacronumber">15.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">subseq</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">subseq</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">); </span><span class="comment"> start from the next heading in source</span>
|
|
<span class="plain">(</span><span class="identifier">subseq</span><span class="plain">) && (</span><span class="identifier">subseq</span><span class="plain">-></span><span class="element">level</span><span class="plain"> >= </span><span class="identifier">h</span><span class="plain">-></span><span class="identifier">level</span><span class="plain">); </span><span class="comment"> for a run with level below or equal h</span>
|
|
<span class="identifier">subseq</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">subseq</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)) { </span><span class="comment"> in source declaration order</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subseq</span><span class="plain">-></span><span class="element">level</span><span class="plain"> == </span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain">) { </span><span class="comment"> a heading of equal status ends the run...</span>
|
|
<span class="functiontext"><a href="#SP16">Headings::make_child_heading</a></span><span class="plain">(</span><span class="identifier">subseq</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">; </span><span class="comment"> ...and becomes h's sibling</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="#SP16">Headings::make_child_heading</a></span><span class="plain">(</span><span class="identifier">subseq</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">); </span><span class="comment"> all lesser headings in the run become h's children</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>The above routine, then, calls <code class="display"><span class="extract">Headings::make_child_heading</span></code> to attach a heading
|
|
to the tree as a child of a given parent:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::make_child_heading<button class="popup" onclick="togglePopup('usagePopup322')">...<span class="popuptext" id="usagePopup322">Usage of <b>Headings::make_child_heading</b>:<br><a href="#SP15_2">§15.2</a>, <a href="#SP15_3">§15.3</a></span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">former_pa</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">former_pa</span><span class="plain"> == </span><span class="identifier">pa</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">16.1</span>><span class="plain">;</span>
|
|
<span class="identifier">ch</span><span class="plain">-></span><span class="element">parent_heading</span><span class="plain"> = </span><span class="identifier">pa</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">16.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16_1"></a><b>§16.1. </b>If ch is present in the tree, it must have a parent, unless it is the
|
|
pseudo-heading: but the latter can never be moved, so it isn't. Therefore
|
|
we can remove ch by striking it out from the children list of the parent.
|
|
(Any children which ch has, grandchildren so to speak, come with it.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Detach ch from the heading tree if it is already there</span> <span class="cwebmacronumber">16.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">former_pa</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">former_pa</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain"> == </span><span class="identifier">ch</span><span class="plain">)</span>
|
|
<span class="identifier">former_pa</span><span class="plain">-></span><span class="identifier">child_heading</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">sibling</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">sibling</span><span class="plain"> = </span><span class="identifier">former_pa</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain">; </span><span class="identifier">sibling</span><span class="plain">; </span><span class="identifier">sibling</span><span class="plain"> = </span><span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> == </span><span class="identifier">ch</span><span class="plain">) {</span>
|
|
<span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ch</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP16">§16</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16_2"></a><b>§16.2. </b>Two cases: the new parent is initially childless, or it isn't.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Add ch to the end of the list of children of pa</span> <span class="cwebmacronumber">16.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">sibling</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pa</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">pa</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">sibling</span><span class="plain"> = </span><span class="identifier">pa</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain">; </span><span class="identifier">sibling</span><span class="plain">; </span><span class="identifier">sibling</span><span class="plain"> = </span><span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">sibling</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">;</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="#SP16">§16</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Verifying the heading tree. </b>We have now, in effect, computed the indentation value of each heading twice,
|
|
by two entirely different methods: first by the mathematical argument above,
|
|
then by observing that it is the depth in the heading tree. Seeing if
|
|
these two methods have given the same answer provides a convenient check on
|
|
our working.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_tree_damaged</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">Headings::verify_heading_tree<button class="popup" onclick="togglePopup('usagePopup323')">...<span class="popuptext" id="usagePopup323">Usage of <b>Headings::verify_heading_tree</b>:<br><a href="#SP15">§15</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP17">Headings::verify_heading_tree_r</a></span><span class="plain">(&</span><span class="identifier">pseudo_heading</span><span class="plain">, -1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">heading_tree_damaged</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"heading tree failed to verify"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::verify_heading_tree_r<button class="popup" onclick="togglePopup('usagePopup324')">...<span class="popuptext" id="usagePopup324">Usage of <b>Headings::verify_heading_tree_r</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain"> != &</span><span class="identifier">pseudo_heading</span><span class="plain">) && (</span><span class="identifier">depth</span><span class="plain"> != </span><span class="identifier">h</span><span class="plain">-></span><span class="element">indentation</span><span class="plain">)) {</span>
|
|
<span class="identifier">heading_tree_damaged</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$H\n*** indentation should be %d ***\n"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="#SP17">Headings::verify_heading_tree_r</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">child_heading</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1);</span>
|
|
<span class="functiontext"><a href="#SP17">Headings::verify_heading_tree_r</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">next_heading</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Miscellaneous heading services. </b>The first of these we have already seen in use: the sentence-breaker calls
|
|
it to ask whether sentences falling under the current heading should be
|
|
included in the active source text. (For instance, sentences under a
|
|
heading with the disclaimer "(for Glulx only)" will not be included
|
|
if the target virtual machine on this run of Inform is the Z-machine.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Headings::include_material<button class="popup" onclick="togglePopup('usagePopup325')">...<span class="popuptext" id="usagePopup325">Usage of <b>Headings::include_material</b>:<br><a href="#SP11">§11</a></span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">releasing</span><span class="plain"> = </span><span class="functiontext"><a href="1-ic.html#SP7">Inbuild::currently_releasing</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_release</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) && (</span><span class="identifier">releasing</span><span class="plain"> == </span><span class="identifier">FALSE</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_release</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">releasing</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">omit_material</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="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Headings::indexed<button class="popup" onclick="togglePopup('usagePopup326')">...<span class="popuptext" id="usagePopup326">Usage of <b>Headings::indexed</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</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="comment"> definitions made nowhere are normally indexed</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="identifier">index_definitions_made_under_this</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b>A utility to do with the file of origin:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="functiontext">Headings::get_extension_containing<button class="popup" onclick="togglePopup('usagePopup327')">...<span class="popuptext" id="usagePopup327">Usage of <b>Headings::get_extension_containing</b>:<br><a href="#SP23">§23</a></span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">start_location</span><span class="plain">.</span><span class="identifier">file_of_origin</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">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="5-es.html#SP4">Extensions::corresponding_to</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">start_location</span><span class="plain">.</span><span class="identifier">file_of_origin</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b>Although File (0) headings do have text, contrary to the implication of
|
|
the routine here, this text is only what happens to be first in the file:
|
|
it isn't a heading actually typed by the user, which is all that we are
|
|
interested in for this purpose. So we send back a null word range.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Headings::get_text<button class="popup" onclick="togglePopup('usagePopup328')">...<span class="popuptext" id="usagePopup328">Usage of <b>Headings::get_text</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">-></span><span class="identifier">heading_text</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b>This routine determines the (closest) heading to which a scrap of text
|
|
belongs, and is important since the parsing of noun phrases is affected by
|
|
that choice of heading (as we shall see): to Inform, headings provide something
|
|
analogous to the scope of local variables in a conventional programming
|
|
language.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Because every file has a File (0) heading registered at line 1, the loop
|
|
in the following routine is guaranteed to return a valid heading provided
|
|
the original source location is well formed (i.e., has a non-null source
|
|
file and a line number of at least 1).
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Headings::heading_of<button class="popup" onclick="togglePopup('usagePopup329')">...<span class="popuptext" id="usagePopup329">Usage of <b>Headings::heading_of</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">source_location</span><span class="plain"> </span><span class="identifier">sl</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">.</span><span class="identifier">file_of_origin</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">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_BACKWARDS_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sl</span><span class="plain">.</span><span class="identifier">file_of_origin</span><span class="plain"> == </span><span class="identifier">h</span><span class="plain">-></span><span class="element">start_location</span><span class="plain">.</span><span class="identifier">file_of_origin</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">sl</span><span class="plain">.</span><span class="identifier">line_number</span><span class="plain"> >= </span><span class="identifier">h</span><span class="plain">-></span><span class="element">start_location</span><span class="plain">.</span><span class="identifier">line_number</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unable to determine the heading level of source material"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Headings::of_wording<button class="popup" onclick="togglePopup('usagePopup330')">...<span class="popuptext" id="usagePopup330">Usage of <b>Headings::of_wording</b>:<br>none</span></button></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">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP21">Headings::heading_of</a></span><span class="plain">(</span><span class="identifier">Wordings::location</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. Headings with extension dependencies. </b>If the content under a heading depended on the VM not in use, or was marked
|
|
not for release in a release run, we were able to exclude it just by
|
|
skipping. The same cannot be done when a heading says that it should be
|
|
used only if a given extension is, or is not, being used, because when
|
|
the heading is created we don't yet know which extensions are included.
|
|
But when the following is called, we do know that.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">HeadingInPlaceOfUnincluded_SYNERROR</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">UnequalHeadingInPlaceOf_SYNERROR</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">HeadingInPlaceOfSubordinate_SYNERROR</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">HeadingInPlaceOfUnknown_SYNERROR</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::satisfy_dependencies<button class="popup" onclick="togglePopup('usagePopup331')">...<span class="popuptext" id="usagePopup331">Usage of <b>Headings::satisfy_dependencies</b>:<br>Project Services - <a href="5-ps2.html#SP5">§5</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</span><span class="plain"> != </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP23">Headings::satisfy_individual_heading_dependency</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And now the code to check an individual heading's usage. This whole
|
|
thing is carefully timed so that we can still afford to cut up and rearrange
|
|
the parse tree on quite a large scale, and that's just what we do.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::satisfy_individual_heading_dependency<button class="popup" onclick="togglePopup('usagePopup332')">...<span class="popuptext" id="usagePopup332">Usage of <b>Headings::satisfy_individual_heading_dependency</b>:<br><a href="#SP22">§22</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> < </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">loaded</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP13">Works::no_times_used_in_context</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="constant">LOADED_WDBC</span><span class="plain">) != </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">loaded</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">HEADINGS</span><span class="plain">, </span><span class="string">"SIHD on $H: loaded %d: annotation %d: %W: %d\n"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">loaded</span><span class="plain">,</span>
|
|
<span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">,</span>
|
|
<span class="identifier">suppress_heading_dependencies_ANNOT</span><span class="plain">),</span>
|
|
<span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">)) {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="identifier">sentence_declaring</span><span class="plain">,</span>
|
|
<span class="identifier">suppress_heading_dependencies_ANNOT</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">>(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">)) {</span>
|
|
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">));</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">));</span>
|
|
<span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h2</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">loaded</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><<span class="cwebmacro">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">23.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">-></span><span class="element">heading_text</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Wordings::match_perhaps_quoted</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-></span><span class="element">heading_text</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span>
|
|
<span class="functiontext"><a href="#SP19">Headings::get_extension_containing</a></span><span class="plain">(</span><span class="identifier">h2</span><span class="plain">)-></span><span class="element">as_copy</span><span class="plain">-></span><span class="element">edition</span><span class="plain">-></span><span class="element">work</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">))) {</span>
|
|
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">level</span><span class="plain"> != </span><span class="identifier">h2</span><span class="plain">-></span><span class="element">level</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Can't replace heading unless level matches</span> <span class="cwebmacronumber">23.3</span>><span class="character">;</span>
|
|
<span class="functiontext"><a href="#SP24">Headings::excise_material_under</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="#SP24">Headings::excise_material_under</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><<span class="cwebmacro">Can't find heading in the given extension</span> <span class="cwebmacronumber">23.2</span>><span class="character">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">use_with_or_without</span><span class="plain"> != </span><span class="identifier">loaded</span><span class="plain">) </span><span class="functiontext"><a href="#SP24">Headings::excise_material_under</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">h</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="inwebparagraph"><a id="SP23_1"></a><b>§23.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Can't replace heading in an unincluded extension</span> <span class="cwebmacronumber">23.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">HeadingInPlaceOfUnincluded_SYNERROR</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_node</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_work</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. </b>To excise, we simply prune the heading's contents from the parse tree,
|
|
though optionally grafting them to another node rather than discarding them
|
|
altogether.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Any heading which is excised is marked so that it won't have its own
|
|
dependencies checked. This clarifies several cases, and in particular ensures
|
|
that if Chapter X is excised then a subordinate Section Y cannot live on by
|
|
replacing something elsewhere (which would effectively delete the content
|
|
elsewhere).
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::excise_material_under<button class="popup" onclick="togglePopup('usagePopup333')">...<span class="popuptext" id="usagePopup333">Usage of <b>Headings::excise_material_under</b>:<br><a href="#SP23">§23</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">transfer_to</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">HEADINGS</span><span class="plain">, </span><span class="string">"Excision under $H\n"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">hpn</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"stipulations on a non-sentence heading"</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">)) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h2</span><span class="plain"> = </span><span class="functiontext"><a href="#SP24">Headings::find_dependent_heading</a></span><span class="plain">(</span><span class="identifier">hpn</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h2</span><span class="plain">) </span><<span class="cwebmacro">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">24.1</span>><span class="character">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="functiontext"><a href="#SP24">Headings::suppress_dependencies</a></span><span class="plain">(</span><span class="identifier">hpn</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">transfer_to</span><span class="plain">) </span><span class="identifier">ParseTree::graft</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">hpn</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">, </span><span class="identifier">transfer_to</span><span class="plain">);</span>
|
|
<span class="identifier">hpn</span><span class="plain">-></span><span class="identifier">down</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="functiontext">Headings::find_dependent_heading<button class="popup" onclick="togglePopup('usagePopup334')">...<span class="popuptext" id="usagePopup334">Usage of <b>Headings::find_dependent_heading</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pn</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">pn</span><span class="plain">) == </span><span class="identifier">HEADING_NT</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Headings::from_node</a></span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">h</span><span class="plain">) && (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</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">pn</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain">) {</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Headings::from_node</a></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">h</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">h</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>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Headings::suppress_dependencies<button class="popup" onclick="togglePopup('usagePopup335')">...<span class="popuptext" id="usagePopup335">Usage of <b>Headings::suppress_dependencies</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pn</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">pn</span><span class="plain">) == </span><span class="identifier">HEADING_NT</span><span class="plain">)</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">, </span><span class="identifier">suppress_heading_dependencies_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">for</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">pn</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP24">Headings::suppress_dependencies</a></span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24_1"></a><b>§24.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Can't replace heading subordinate to another replaced heading</span> <span class="cwebmacronumber">24.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">HeadingInPlaceOfSubordinate_SYNERROR</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_works</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-></span><span class="identifier">for_use_with</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_nodes</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h2</span><span class="plain">-></span><span class="identifier">sentence_declaring</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP24">§24</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_2"></a><b>§23.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Can't find heading in the given extension</span> <span class="cwebmacronumber">23.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">, </span><span class="string">"unspecified, that is, the extension didn't have a version number"</span><span class="plain">);</span>
|
|
<span class="reserved">inform_extension</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">inform_extension</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-></span><span class="element">as_copy</span><span class="plain">-></span><span class="element">edition</span><span class="plain">-></span><span class="element">work</span><span class="plain">)) {</span>
|
|
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">);</span>
|
|
<span class="identifier">VersionNumbers::to_text</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-></span><span class="element">as_copy</span><span class="plain">-></span><span class="element">edition</span><span class="plain">-></span><span class="element">version</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new_T</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">HeadingInPlaceOfUnknown_SYNERROR</span><span class="plain">, </span><span class="identifier">vt</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_node</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_work</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">for_use_with</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_wording</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">in_place_of_text</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">vt</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_3"></a><b>§23.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Can't replace heading unless level matches</span> <span class="cwebmacronumber">23.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext"><a href="2-ce.html#SP2">CopyErrors::new</a></span><span class="plain">(</span><span class="constant">SYNTAX_CE</span><span class="plain">, </span><span class="constant">UnequalHeadingInPlaceOf_SYNERROR</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-ce.html#SP3">CopyErrors::supply_node</a></span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-></span><span class="element">sentence_declaring</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-cps.html#SP5">Copies::attach_error</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="6-st.html">Back to 'Source Text'</a></li><li><a href="6-inc.html">Continue with 'Inclusions'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
MathJax = {
|
|
tex: {
|
|
inlineMath: '$', '$'], ['\\(', '\\)'
|
|
},
|
|
svg: {
|
|
fontCache: 'global'
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
|
</script>
|
|
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|