276 lines
27 KiB
HTML
276 lines
27 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>2/ec</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '2/pn' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</a></li><li><a href="index.html">inweb 7</a></li><li><a href="index.html#2">Chapter 2: Parsing a Web</a></li><li><b>Paragraph Numbering</b></li></ul><p class="purpose">To work out paragraph numbers within each section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>Traditional LP tools have numbered paragraphs in the obvious way, starting
|
|
from 1 and working up to what may be an enormous number. (The web for Knuth's
|
|
Metafont runs from 1 to 1215, for example.) Inweb expects to be working on
|
|
rather larger programs and therefore numbers independently from 1 within
|
|
each section. It also tries to make the numbering more structurally relevant:
|
|
thus paragraph 1.1 will be used within paragraph 1, and so on.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It's a little ambiguous how to do this for the best, as we'll see.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We can certainly only do it if we know exactly where macros are used. This
|
|
is something we scan for on a weave, but not on a tangle; that's fine, though,
|
|
because tangled code doesn't need to know its own paragraph numbers.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-</span><span class="element">>chapters</span><span class="plain">) {</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>sections</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Scan this section to see where paragraph macros are used</span> <span class="cwebmacronumber">1.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Work out paragraph numbers within this section</span> <span class="cwebmacronumber">1.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Numbering::number_web is used in 1/pc (<a href="1-pc.html#SP7_2_3">§7.2.3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Scan this section to see where paragraph macros are used</span> <span class="cwebmacronumber">1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>first_line</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next_line</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>text</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mlen</span><span class="plain">, </span><span class="identifier">mpos</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">mpos</span><span class="plain"> = </span><span class="functiontext">Regexp::find_expansion</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="character">'@'</span><span class="plain">, </span><span class="character">'<'</span><span class="plain">, </span><span class="character">'@'</span><span class="plain">, </span><span class="character">'>'</span><span class="plain">, &</span><span class="identifier">mlen</span><span class="plain">)) != -1) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">found_macro</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">found_macro</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">mpos</span><span class="plain">+2), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">mpos</span><span class="plain">+</span><span class="identifier">mlen</span><span class="plain">-2));</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">original_p</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">original_p</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">original_p</span><span class="plain">, </span><span class="identifier">mpos</span><span class="plain"> + </span><span class="identifier">mlen</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">original_p</span><span class="plain">));</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">original_p</span><span class="plain">);</span>
|
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="functiontext">Macros::find_by_name</span><span class="plain">(</span><span class="identifier">found_macro</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) </span><<span class="cwebmacro">Add a record that the macro is used in this paragraph</span> <span class="cwebmacronumber">1.1.2</span>><span class="plain">;</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">found_macro</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</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="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_1_1"></a><b>§1.1.1. </b>Each macro comes with a linked list of notes about which paragraphs use
|
|
it; necessarily paragraphs within the same section.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This paragraph you're looking at now shows the difficulty involved in
|
|
paragraph numbering. It's not a macro, so it's not obviously used by any
|
|
other paragraph. Should it be bumped up to paragraph 2? But if we do that,
|
|
we end up with numbers out of order, since the one after it would have to
|
|
be 1.1.1. Instead this one will be 1.1.1, to place it into the natural
|
|
lexicographic sequence.
|
|
</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">macro_usage</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">used_in_paragraph</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">multiplicity</span><span class="plain">; </span> <span class="comment">for example, 2 if it's used twice in this paragraph</span>
|
|
<span class="constant">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">macro_usage</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure macro_usage is accessed in 3/tw and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_1_2"></a><b>§1.1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Add a record that the macro is used in this paragraph</span> <span class="cwebmacronumber">1.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">macro_usage</span><span class="plain"> *</span><span class="identifier">mu</span><span class="plain">, *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">-</span><span class="element">>macro_usages</span><span class="plain">) {</span>
|
|
<span class="identifier">last</span><span class="plain"> = </span><span class="identifier">mu</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mu</span><span class="plain">-</span><span class="element">>used_in_paragraph</span><span class="plain"> == </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>owning_paragraph</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">mu</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">mu</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">macro_usage</span><span class="plain">);</span>
|
|
<span class="identifier">mu</span><span class="plain">-</span><span class="element">>used_in_paragraph</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>owning_paragraph</span><span class="plain">;</span>
|
|
<span class="identifier">mu</span><span class="plain">-</span><span class="element">>multiplicity</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">-</span><span class="element">>macro_usages</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">mu</span><span class="plain">-</span><span class="element">>multiplicity</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_1">§1.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2"></a><b>§1.2. </b>Basically we'll form the paragraphs into a tree, or in fact a forest. If a
|
|
paragraph defines a macro then we want it to be a child node of the
|
|
paragraph where the macro is first used; it's then a matter of filling in
|
|
other nodes a bit speculatively.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work out paragraph numbers within this section</span> <span class="cwebmacronumber">1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">The parent of a macro definition is the place where it's first used</span> <span class="cwebmacronumber">1.2.1</span>><span class="character">;</span>
|
|
<<span class="cwebmacro">Otherwise share the parent of a following paragraph, provided it precedes us</span> <span class="cwebmacronumber">1.2.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Create paragraph number texts</span> <span class="cwebmacronumber">1.2.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Number the still parent-less paragraphs consecutively from 1</span> <span class="cwebmacronumber">1.2.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Recursively derive the numbers of parented paragraphs from those of their parents</span> <span class="cwebmacronumber">1.2.5</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_1"></a><b>§1.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">The parent of a macro definition is the place where it's first used</span> <span class="cwebmacronumber">1.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>paragraphs</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>defines_macro</span><span class="plain">) {</span>
|
|
<span class="reserved">macro_usage</span><span class="plain"> *</span><span class="identifier">mu</span><span class="plain"> =</span>
|
|
<span class="identifier">FIRST_IN_LINKED_LIST</span><span class="plain">(</span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-</span><span class="element">>defines_macro</span><span class="plain">-</span><span class="element">>macro_usages</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mu</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain"> = </span><span class="identifier">mu</span><span class="plain">-</span><span class="element">>used_in_paragraph</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_2"></a><b>§1.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Otherwise share the parent of a following paragraph, provided it precedes us</span> <span class="cwebmacronumber">1.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>paragraphs</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">linked_list_item</span><span class="plain"> *</span><span class="identifier">P2_item</span><span class="plain"> = </span><span class="identifier">P_item</span><span class="plain">; </span><span class="identifier">P2_item</span><span class="plain">; </span><span class="identifier">P2_item</span><span class="plain"> = </span><span class="identifier">NEXT_ITEM_IN_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P2_item</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">)) {</span>
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P2</span><span class="plain"> = </span><span class="identifier">CONTENT_IN_ITEM</span><span class="plain">(</span><span class="identifier">P2_item</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P2</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P2</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">-</span><span class="element">>allocation_id</span><span class="plain"> < </span><span class="identifier">P</span><span class="plain">-</span><span class="element">>allocation_id</span><span class="plain">)</span>
|
|
<span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain"> = </span><span class="identifier">P2</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_3"></a><b>§1.2.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create paragraph number texts</span> <span class="cwebmacronumber">1.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>paragraphs</span><span class="plain">)</span>
|
|
<span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_4"></a><b>§1.2.4. </b>Now we have our tree, and we number paragraphs accordingly: root notes are
|
|
numbered 1, 2, 3, ..., and then children are numbered with suffixes .1, .2, .3,
|
|
..., under their parents.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Number the still parent-less paragraphs consecutively from 1</span> <span class="cwebmacronumber">1.2.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">top_level</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>paragraphs</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">top_level</span><span class="plain">++);</span>
|
|
<span class="identifier">P</span><span class="plain">-</span><span class="element">>next_child_number</span><span class="plain"> = 1;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_5"></a><b>§1.2.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Recursively derive the numbers of parented paragraphs from those of their parents</span> <span class="cwebmacronumber">1.2.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>paragraphs</span><span class="plain">)</span>
|
|
<span class="functiontext">Numbering::settle_paragraph_number</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The following paragraph shows the deficiencies of the algorithm: it's going
|
|
to end up numbered 2, because it isn't used anywhere and doesn't seem to be
|
|
in the middle of a wider description. But better to keep it in the sequence
|
|
chosen by the author, so 2 it is.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Numbering::settle_paragraph_number</span><span class="plain">(</span><span class="reserved">paragraph</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="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">) > 0) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">, </span><span class="string">"X"</span><span class="plain">); </span> <span class="comment">to prevent malformed sections hanging this</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">) </span><span class="functiontext">Numbering::settle_paragraph_number</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">, </span><span class="string">"%S.%d"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">-</span><span class="element">>paragraph_number</span><span class="plain">,</span>
|
|
<span class="identifier">P</span><span class="plain">-</span><span class="element">>parent_paragraph</span><span class="plain">-</span><span class="element">>next_child_number</span><span class="plain">++);</span>
|
|
<span class="identifier">P</span><span class="plain">-</span><span class="element">>next_child_number</span><span class="plain"> = 1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Numbering::settle_paragraph_number is used in <a href="#SP1_2_5">§1.2.5</a>.</p>
|
|
|
|
<!--End of weave: 161 lines from a web of 20876-->
|
|
</body>
|
|
</html>
|
|
|