1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/indoc/2-ss.html
Graham Nelson 1268a0f40e Colonised
2020-04-14 17:56:54 +01:00

492 lines
79 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Structural Scan</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>Other Tools</h2><ul>
<li><a href="../inblorb/index.html">inblorb</a></li>
<li><a href="index.html"><span class="selectedlink">indoc</span></a></li>
<li><a href="../inpolicy/index.html">inpolicy</a></li>
<li><a href="../inrtps/index.html">inrtps</a></li>
</ul><h2>Foundation</h2><ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Structural Scan' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">indoc</a></li><li><a href="index.html#2">Chapter 2: Processing</a></li><li><b>Structural Scan</b></li></ul><p class="purpose">Finding out how a volume divides up into chapters and sections.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Volumes</a></li><li><a href="#SP6">&#167;6. Section title scanning</a></li><li><a href="#SP7">&#167;7. The manifest file</a></li><li><a href="#SP8">&#167;8. Ebook markup</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Projects are divided into volumes, which are divided into chapters, which
in turn are divided into sections.
</p>
<p class="inwebparagraph">Volumes count from 0, in order of creation, so these are arrays.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_VOLUMES</span><span class="plain"> </span><span class="constant">100</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_CHAPTERS_PER_VOLUME</span><span class="plain"> </span><span class="constant">100</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_SECTIONS_PER_VOLUME</span><span class="plain"> </span><span class="constant">1000</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_EXAMPLES_PER_VOLUME</span><span class="plain"> </span><span class="constant">MAX_EXAMPLES</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">volume</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_title</span><span class="plain">; </span><span class="comment"> e.g., "What Katy Did Next"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_abbrev</span><span class="plain">; </span><span class="comment"> e.g., "WKDN"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_prefix</span><span class="plain">; </span><span class="comment"> e.g., "K"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">vol_rawtext_filename</span><span class="plain">; </span><span class="comment"> source file</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_CSS_leafname</span><span class="plain">; </span><span class="comment"> CSS file used for pages in this volume</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_URL</span><span class="plain">; </span><span class="comment"> link to start of volume</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">vol_chapter_count</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">vol_section_count</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">chapters</span><span class="plain">[</span><span class="constant">MAX_CHAPTERS_PER_VOLUME</span><span class="plain">]; </span><span class="comment"> these count from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">sections</span><span class="plain">[</span><span class="constant">MAX_SECTIONS_PER_VOLUME</span><span class="plain">]; </span><span class="comment"> but these count from 0</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">examples_sequence</span><span class="plain">[</span><span class="constant">MAX_EXAMPLES_PER_VOLUME</span><span class="plain">]; </span><span class="comment"> also these</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">sections_by_name</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">volume</span><span class="plain">;</span>
<span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">volumes</span><span class="plain">[</span><span class="constant">MAX_VOLUMES</span><span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure volume is accessed in 1/mn, 1/ins, 2/exm, 2/rnd, 2/rr, 2/haj, 2/css, 3/gi, 3/ei, 4/nd, 4/cm, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Chapters:
</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">chapter</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_title</span><span class="plain">; </span><span class="comment"> e.g., "The Pension Suisse"</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chapter_number</span><span class="plain">; </span><span class="comment"> counting from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_full_title</span><span class="plain">; </span><span class="comment"> e.g., "Chapter 7: The Pension Suisse"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">begins_at_section</span><span class="plain">; </span><span class="comment"> e.g., section 51 might be the first of chapter 7</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_anchor</span><span class="plain">; </span><span class="comment"> HTML anchor to place at front of chapter, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_URL</span><span class="plain">; </span><span class="comment"> link to start of chapter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">next_chapter</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">previous_chapter</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_chapter</span><span class="plain"> *</span><span class="identifier">ebook_ref</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">chapter</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure chapter is accessed in 5/ee, 2/rnd, 3/ei, 4/nd, 4/cl, 4/cm, 4/ca, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Sections:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_DRS_PER_SECTION</span><span class="plain"> </span><span class="constant">100</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">in_which_chapter</span><span class="plain">; </span><span class="comment"> e.g., 7</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">begins_which_chapter</span><span class="plain">; </span><span class="comment"> e.g., 7, but -1 if it doesn't open a chapter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unlabelled_title</span><span class="plain">; </span><span class="comment"> e.g., "Corsica"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">label</span><span class="plain">; </span><span class="comment"> e.g., "7.1"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">; </span><span class="comment"> e.g, "7.1. Corsica"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sort_code</span><span class="plain">; </span><span class="comment"> a formatted version of the label for alphabetic sorting</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">section_filename</span><span class="plain">; </span><span class="comment"> filename to write this section (and perhaps others) into</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_file_title</span><span class="plain">; </span><span class="comment"> title the whole file will have</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_anchor</span><span class="plain">; </span><span class="comment"> HTML anchor to place at front of section, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_URL</span><span class="plain">; </span><span class="comment"> link to start of section</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unanchored_URL</span><span class="plain">; </span><span class="comment"> link to start of file holding this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_doc_reference_symbols</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">doc_reference_symbols</span><span class="plain">[</span><span class="constant">MAX_DRS_PER_SECTION</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">next_section</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">previous_section</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number_within_volume</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">section</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure section is accessed in 2/exm, 2/rnd, 2/utc, 3/gi, 3/ei, 4/nd, 4/cl, 4/cm, 4/ca, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Volumes. </b>These are created when we scan the instructions file.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::create_volume<button class="popup" onclick="togglePopup('usagePopup23')">...<span class="popuptext" id="usagePopup23">Usage of <b>Scanner::create_volume</b>:<br>Instructions - <a href="1-ins.html#SP5_1_2">&#167;5.1.2</a></span></button></span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">book_path</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leaf</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">abbrev_supplied</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">abbrev_supplied</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> &gt;= </span><span class="constant">MAX_VOLUMES</span><span class="plain">) </span><span class="functiontext"><a href="3-em.html#SP2">Errors::fatal</a></span><span class="plain">(</span><span class="string">"too many volumes"</span><span class="plain">);</span>
<span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">volume</span><span class="plain">);</span>
<span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">no_volumes</span><span class="plain">++] = </span><span class="identifier">V</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_abbrev</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_rawtext_filename</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">book_path</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_CSS_leafname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_URL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_chapter_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_section_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">sections_by_name</span><span class="plain"> = </span><span class="functiontext"><a href="2-dct.html#SP2">Dictionaries::new</a></span><span class="plain">(100, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Volume %d: %S %S %S %f\n"</span><span class="plain">, </span><span class="identifier">no_volumes</span><span class="plain">-1, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">pre</span><span class="plain">,</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_rawtext_filename</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">title</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"Untitled"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP20">Str::begins_with_wide_string</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"A "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP20">Str::begins_with_wide_string</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"An "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP20">Str::begins_with_wide_string</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"The "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">4</span><span class="plain">;</span>
<span class="reserved">for</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">f</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">title</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">title</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="functiontext"><a href="4-chr.html#SP2">Characters::is_whitespace</a></span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'a'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'z'</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">c</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="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</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="constant">0</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="identifier">no_volumes</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="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="identifier">vol_abbrev</span><span class="plain">)) || (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="string">"_%d"</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="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">, </span><span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">vol_prefix</span><span class="plain">)) || (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">, </span><span class="string">"_%d"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Section title scanning. </b>This is a much skimpier first-pass-only scan which looks for section titles,
marrying them up with block numbers.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::scan_rawtext_for_section_titles<button class="popup" onclick="togglePopup('usagePopup24')">...<span class="popuptext" id="usagePopup24">Usage of <b>Scanner::scan_rawtext_for_section_titles</b>:<br>Main - <a href="1-mn.html#SP1_2">&#167;1.2</a></span></button></span><span class="plain">(</span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">rawtext_filename</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_rawtext_filename</span><span class="plain">;</span>
<span class="reserved">sr_helper_state</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">.</span><span class="element">s</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">.</span><span class="element">ch</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">.</span><span class="element">chs</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">.</span><span class="element">v</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">.</span><span class="element">owner</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">;</span>
<span class="functiontext"><a href="4-tf.html#SP5">TextFiles::read</a></span><span class="plain">(</span><span class="identifier">rawtext_filename</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open instructions file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext"><a href="#SP6">Scanner::scan_rawtext_helper</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">sr</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_section_count</span><span class="plain"> = </span><span class="identifier">sr</span><span class="plain">.</span><span class="element">s</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_chapter_count</span><span class="plain"> = </span><span class="identifier">sr</span><span class="plain">.</span><span class="element">ch</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_URL</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sr</span><span class="plain">.</span><span class="element">s</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_URL</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">[0]-&gt;</span><span class="element">unanchored_URL</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_section_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">previous_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">-1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_section_count</span><span class="plain">-1) </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">next_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1];</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_chapter_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">chapter_number</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">+1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">previous_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">-1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_chapter_count</span><span class="plain">-1) </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-&gt;</span><span class="element">next_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1];</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">sr_helper_state</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">; </span><span class="comment"> volume number</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">; </span><span class="comment"> section number within the volume, starting from 0</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ch</span><span class="plain">; </span><span class="comment"> chapter number within the volume, starting from 1</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chs</span><span class="plain">; </span><span class="comment"> section number within current chapter, starting from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">sr_helper_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::scan_rawtext_helper<button class="popup" onclick="togglePopup('usagePopup25')">...<span class="popuptext" id="usagePopup25">Usage of <b>Scanner::scan_rawtext_helper</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">,</span>
<span class="reserved">void</span><span class="plain"> *</span><span class="identifier">v_sr</span><span class="plain">) {</span>
<span class="reserved">sr_helper_state</span><span class="plain"> *</span><span class="identifier">sr</span><span class="plain"> = (</span><span class="reserved">sr_helper_state</span><span class="plain"> *) </span><span class="identifier">v_sr</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) "</span><span class="plain">)) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[(%c*?)%] (%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">CREATE</span><span class="plain">(</span><span class="reserved">section</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">next_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">previous_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">begins_which_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">no_doc_reference_symbols</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">number_within_volume</span><span class="plain"> = </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">s</span><span class="plain">++;</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="identifier">sections</span><span class="plain">[</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">number_within_volume</span><span class="plain">] = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chi</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stitle</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1];</span>
&lt;<span class="cwebmacro">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure sr_helper_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr2</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{(%c*?:}(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="1-cs.html#SP4">Symbols::perform_ifdef</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) {%c*?} *"</span><span class="plain">)) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) "</span><span class="plain">)) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr2</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter: (%c*)"</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="identifier">CREATE</span><span class="plain">(</span><span class="reserved">chapter</span><span class="plain">);</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="identifier">chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">++] = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_full_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_full_title</span><span class="plain">, </span><span class="string">"Chapter %d: %S"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_title</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">begins_which_chapter</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">begins_at_section</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">next_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">previous_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">ebook_ref</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = (</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">-1]: </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">in_which_chapter</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">++;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">label</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">label</span><span class="plain">, </span><span class="string">"%d.%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sort_code</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sort_code</span><span class="plain">, </span><span class="string">"%03d-%03d-%03d-000"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="string">"%S. %S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">label</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">unlabelled_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext"><a href="2-dct.html#SP5">Dictionaries::create</a></span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext"><a href="2-dct.html#SP8">Dictionaries::write_value</a></span><span class="plain">(</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="identifier">sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">)</span>
<span class="functiontext"><a href="4-sm.html#SP14">Str::put</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="functiontext"><a href="4-chr.html#SP1">Characters::toupper</a></span><span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)));</span>
<span class="functiontext"><a href="2-dct.html#SP5">Dictionaries::create</a></span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext"><a href="2-dct.html#SP8">Dictionaries::write_value</a></span><span class="plain">(</span>
<span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="identifier">sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">S</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">begins_which_chapter</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>&#167;6.3.1. </b>This is relevant only to HTML, of course. The idea is that each section
has some linkable location, in the form of either a file URL, or a file plus
an anchor name: for example, it might be <code class="display"><span class="extract">WKDN_7.html#s4</span></code>. If the
anchor is blank, the filename alone is used.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">extension</span><span class="plain"> = </span><span class="string">"txt"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><span class="identifier">extension</span><span class="plain"> = </span><span class="string">"html"</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">granularity</span><span class="plain"> == </span><span class="constant">SECTION_GRANULARITY</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">html_for_Inform_application</span><span class="plain">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%Sdoc%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="identifier">owner</span><span class="plain">-&gt;</span><span class="element">vol_prefix</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">s</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S_%d_%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_file_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">granularity</span><span class="plain"> == </span><span class="constant">CHAPTER_GRANULARITY</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S_%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain">, </span><span class="string">"s%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_file_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_full_title</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">vol_abbrev</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain">, </span><span class="string">"c%d_s%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_file_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">owner</span><span class="plain">-&gt;</span><span class="element">vol_title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_filename</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">destination</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_URL</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">unanchored_URL</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_URL</span><span class="plain">, </span><span class="string">"#%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_anchor</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>&#167;6.3.2. </b>And similarly for chapters.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_anchor</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">granularity</span><span class="plain"> == </span><span class="constant">SECTION_GRANULARITY</span><span class="plain">) {</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">granularity</span><span class="plain"> == </span><span class="constant">CHAPTER_GRANULARITY</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_anchor</span><span class="plain">, </span><span class="string">"chapter_%d_%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_anchor</span><span class="plain">, </span><span class="string">"chapter_%d_%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-&gt;</span><span class="element">ch</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_URL</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">unanchored_URL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_anchor</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_URL</span><span class="plain">, </span><span class="string">"#%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">chapter_anchor</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. The manifest file. </b>Its destiny is to hold a simple machine-readable contents listing, and it
helps the Inform application in searching the online documentation.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::write_manifest_file<button class="popup" onclick="togglePopup('usagePopup26')">...<span class="popuptext" id="usagePopup26">Usage of <b>Scanner::write_manifest_file</b>:<br>Main - <a href="1-mn.html#SP1_4">&#167;1.4</a></span></button></span><span class="plain">(</span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span>
<span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">destination</span><span class="plain">, </span><span class="identifier">indoc_settings</span><span class="plain">-&gt;</span><span class="element">manifest_leafname</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">M_struct</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;</span><span class="identifier">M_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-str.html#SP24">Streams::open_to_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal_with_file</a></span><span class="plain">(</span><span class="string">"can't write manifest file"</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">vol_section_count</span><span class="plain">; </span><span class="identifier">i</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">V</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"doc%d.html: %S %S\n"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">label</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="2-str.html#SP34">Streams::close</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Ebook markup. </b>This places internal markup within files in the EPUB version.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::mark_up_ebook<button class="popup" onclick="togglePopup('usagePopup27')">...<span class="popuptext" id="usagePopup27">Usage of <b>Scanner::mark_up_ebook</b>:<br>Main - <a href="1-mn.html#SP1">&#167;1</a></span></button></span><span class="plain">(</span><span class="reserved">void</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</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="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">in_which_chapter</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">) </span><span class="functiontext"><a href="5-ee.html#SP5">Epub::set_mark_in_chapter</a></span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">ebook_ref</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">section_URL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 2: Processing.)</i></li><li><a href="2-exm.html">Continue with 'Examples'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<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>