inweb-bootstrap/docs/foundation-module/8-ws.html
2020-04-10 21:29:28 +01:00

920 lines
115 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Web Structure</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="../webs.html">Sources</a></h1>
<ul>
<li><a href="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Web Structure' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#8">Chapter 8: Literate Programming</a></li><li><b>Web Structure</b></li></ul><p class="purpose">To read the structure of a literate programming web from a path in the file system.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Web MD</a></li><li><a href="#SP5">&#167;5. Reading from the file system</a></li><li><a href="#SP6">&#167;6. Reading the contents page</a></li><li><a href="#SP8">&#167;8. Relative pathnames or filenames</a></li><li><a href="#SP9">&#167;9. Statistics</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Introduction. </b>Webs are literate programs for the Inweb LP system. A single web consists of
a number of chapters (though sometimes just one, called "Sections"), each
of which consists of a number of sections. A web can represent a stand-alone
program, or a library to be used in multiple programs, in which case it is
called a "module".
</p>
<p class="inwebparagraph">Inweb syntax has gradually shifted over the years, but there are two main
versions: the second was cleaned up and simplified from the first in 2019.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">V1_SYNTAX</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">V2_SYNTAX</span>
</pre>
<pre class="display">
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Web MD. </b>No relation to the website of the same name: MD here stands for metadata.
Our task in this section will be to read a web from the filing system and
produce the following metadata structure.
</p>
<p class="inwebparagraph">Each web produces a single instance of <code class="display"><span class="extract">web_md</span></code>:
</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">web_md</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_web</span><span class="plain">; </span><span class="comment"> relative to the current working directory</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">single_file</span><span class="plain">; </span><span class="comment"> relative to the current working directory</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">bibliographic_data</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">web_bibliographic_datum</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">version_number</span><span class="plain">; </span><span class="comment"> as deduced from bibliographic data</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_syntax</span><span class="plain">; </span><span class="comment"> which version syntax the sections will have</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chaptered</span><span class="plain">; </span><span class="comment"> has the author explicitly divided it into named chapters?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">main_language_name</span><span class="plain">; </span><span class="comment"> in which most of the sections are written</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">as_module</span><span class="plain">; </span><span class="comment"> the root of a small dependency graph</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">contents_filename</span><span class="plain">; </span><span class="comment"> or <code class="display"><span class="extract">NULL</span></code> for a single-file web</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">tangle_target_names</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">text_stream</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">header_filenames</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">filename</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">chapters_md</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">chapter_md</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">sections_md</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">section_md</span></code></span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">web_md</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure web_md is accessed in 8/bdfw, 8/wm, 8/bf and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The <code class="display"><span class="extract">chapters_md</span></code> list in a <code class="display"><span class="extract">web_md</span></code> contains these as its entries:
</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_md</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">ch_range</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_title</span><span class="plain">; </span><span class="comment"> e.g., "Chapter 3: Fresh Water Fish"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_basic_title</span><span class="plain">; </span><span class="comment"> e.g., "Chapter 3"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_decorated_title</span><span class="plain">; </span><span class="comment"> e.g., "Fresh Water Fish"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">rubric</span><span class="plain">; </span><span class="comment"> optional; without double-quotation marks</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_language_name</span><span class="plain">; </span><span class="comment"> in which most of the sections are written</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">imported</span><span class="plain">; </span><span class="comment"> from a different web?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">sections_md</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">section_md</span></code></span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">chapter_md</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure chapter_md is accessed in 8/wm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And the <code class="display"><span class="extract">sections_md</span></code> list in a <code class="display"><span class="extract">chapter_md</span></code> contains these as its entries:
</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">section_md</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">sect_title</span><span class="plain">; </span><span class="comment"> e.g., "Program Control"</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">using_syntax</span><span class="plain">; </span><span class="comment"> which syntax the web is written in</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_a_singleton</span><span class="plain">; </span><span class="comment"> is this the only section in its entire web?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">source_file_for_section</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">tag_name</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">sect_independent_language</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">sect_language_name</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">titling_line_to_insert</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">section_md</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure section_md is accessed in 5/htm, 8/wm and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Reading from the file system. </b>Webs can be stored in two ways: as a directory containing a multitude of files,
in which case the pathname <code class="display"><span class="extract">P</span></code> is supplied; or as a single file with everything
in one (and thus, implicitly, a single chapter and a single section), in which
case a filename <code class="display"><span class="extract">alt_F</span></code> is supplied.
</p>
<pre class="display">
<span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get_without_modules</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">alt_F</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">syntax_version</span><span class="plain">,</span>
<span class="reserved">module_search</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">verbosely</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">including_modules</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">including_modules</span><span class="plain">) &amp;&amp; (</span><span class="identifier">I</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">I</span><span class="plain"> = </span><span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Begin the bibliographic data</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Initialise the rest of the web MD</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">WebMetadata::read_contents_page</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">verbosely</span><span class="plain">,</span>
<span class="identifier">including_modules</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">path_to_inweb</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Consolidate the bibliographic data</span> <span class="cwebmacronumber">5.3</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wm</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebMetadata::get_without_modules appears nowhere else.</p>
<p class="endnote">The function WebMetadata::get appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin the bibliographic data</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">bibliographic_data</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">web_bibliographic_datum</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="identifier">Wm</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">Initialise the rest of the web MD</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain"> = </span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain"> = </span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">alt_F</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain"> = </span><span class="identifier">alt_F</span><span class="plain">;</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">version_number</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::null</span><span class="plain">();</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain"> = </span><span class="identifier">syntax_version</span><span class="plain">;</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">sections_md</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">chapter_md</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">tangle_target_names</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">main_language_name</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">header_filenames</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain"> = </span><span class="functiontext">WebModules::create_main_module</span><span class="plain">(</span><span class="identifier">Wm</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_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Consolidate the bibliographic data</span> <span class="cwebmacronumber">5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">);</span>
<span class="functiontext">BuildFiles::set_bibliographic_data_for</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">);</span>
<span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="identifier">Wm</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. Reading the contents page. </b>Making the web begins by reading the contents section, which really isn't a
section at all (and perhaps we shouldn't pretend that it is by the use of the
<code class="display"><span class="extract">.w</span></code> file extension, but we probably want it to have the same file extension,
and its syntax is chosen so that syntax-colouring for regular sections doesn't
make it look odd). When the word "section" is used in the Inweb code, it
almost always means "section other than the contents".
</p>
<p class="inwebparagraph">Because a contents page can, by importing a module, cause a further contents
page to be read, we set this up as a recursion.
</p>
<p class="inwebparagraph">We then run through an individual contents page line by line, using the
following slate of variables to keep track of where we are.
</p>
<p class="inwebparagraph">With a single-file web, the "contents section" doesn't exist as a file in its
own right: instead, it's the top few lines of the single file. We handle that
by halting at the junction point.
</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">reader_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">contents_filename</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_biblio</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_purpose</span><span class="plain">; </span><span class="comment"> Reading the bit just after the new chapter?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">chapter_being_scanned</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_folder_name</span><span class="plain">; </span><span class="comment"> Where sections in the current chapter live</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">titling_line_to_insert</span><span class="plain">; </span><span class="comment"> To be inserted automagically</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to</span><span class="plain">; </span><span class="comment"> Where web material is being read from</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">reading_from</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">import_from</span><span class="plain">; </span><span class="comment"> Where imported webs are</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scan_verbosely</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">including_modules</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">main_web_not_module</span><span class="plain">; </span><span class="comment"> Reading the original web, or an included one?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">halt_at_at</span><span class="plain">; </span><span class="comment"> Used for reading contents pages of single-file webs</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">halted</span><span class="plain">; </span><span class="comment"> Set when such a halt has occurred</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">section_count</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">last_section</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">reader_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_page</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">of_module</span><span class="plain">,</span>
<span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">import_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbosely</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">including_modules</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">reader_state</span><span class="plain"> </span><span class="identifier">RS</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Initialise the reader state</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">.</span><span class="element">contents_filename</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open contents file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">RS</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">verbosely</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain">) {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Read %d lines of contents part at top of file\n"</span><span class="plain">, </span><span class="identifier">cl</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Read contents section (%d lines)\n"</span><span class="plain">, </span><span class="identifier">cl</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">.</span><span class="element">section_count</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">RS</span><span class="plain">.</span><span class="element">last_section</span><span class="plain">-&gt;</span><span class="element">is_a_singleton</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebMetadata::read_contents_page is used in <a href="#SP5">&#167;5</a>, <a href="#SP7_3_3_2">&#167;7.3.3.2</a>.</p>
<p class="endnote">The structure reader_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">Initialise the reader state</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">RS</span><span class="plain">.</span><span class="element">Wm</span><span class="plain"> = </span><span class="identifier">Wm</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">reading_from</span><span class="plain"> = </span><span class="identifier">of_module</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">in_biblio</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">in_purpose</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">chapter_being_scanned</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">chapter_folder_name</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">titling_line_to_insert</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">scan_verbosely</span><span class="plain"> = </span><span class="identifier">verbosely</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">including_modules</span><span class="plain"> = </span><span class="identifier">including_modules</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">path_to</span><span class="plain"> = </span><span class="identifier">path</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">import_from</span><span class="plain"> = </span><span class="identifier">import_path</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">halted</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">path_to_inweb</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">path</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">path</span><span class="plain"> = </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="identifier">path_to_web</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">main_web_not_module</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">main_web_not_module</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain">) {</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">contents_filename</span><span class="plain"> = </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">halt_at_at</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">contents_filename</span><span class="plain"> = </span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">path</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">halt_at_at</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">section_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">.</span><span class="element">last_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The contents section has a syntax quite different from all other sections,
and sets out bibliographic information about the web, the sections and their
organisation, and so on.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</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">X</span><span class="plain">) {</span>
<span class="reserved">reader_state</span><span class="plain"> *</span><span class="identifier">RS</span><span class="plain"> = (</span><span class="reserved">reader_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">halted</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">begins_with_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Characters::is_whitespace</span><span class="plain">(</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">)))</span>
<span class="identifier">begins_with_white_space</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Act immediately if the web syntax version is changed</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">syntax</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">filename_of_single_file_web</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">halt_at_at</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="constant">0</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Halt at this point in the single file, and make the rest of it a one-chapter section</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read regular contents material</span> <span class="cwebmacronumber">7.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebMetadata::read_contents_line is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Since the web syntax version affects how the rest of the file is read, it's
no good simply to store this up for later: we have to change the web structure
immediately.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Act immediately if the web syntax version is changed</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Web Syntax Version: 1"</span><span class="plain">))</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain"> = </span><span class="constant">V1_SYNTAX</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">Str::eq</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Web Syntax Version: 2"</span><span class="plain">))</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>Suppose we're reading a single-file web, and we hit the first <code class="display"><span class="extract">@</span></code> marker.
The contents part has now ended, so we should halt scanning. But we also need
to give the web a single chapter ("Sections", range "S"), which contains a
single section ("All") consisting of the remainder of the single file.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Halt at this point in the single file, and make the rest of it a one-chapter section</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">halted</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">new_chapter_range</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"S"</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">language_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">line</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"Sections"</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Create the new chapter with these details</span> <span class="cwebmacronumber">7.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">line</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"All"</span><span class="plain">;</span>
<span class="identifier">filename_of_single_file_web</span><span class="plain"> = </span><span class="identifier">tfp</span><span class="plain">-&gt;</span><span class="element">text_file_filename</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Read about, and read in, a new section</span> <span class="cwebmacronumber">7.2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b>With those two complications out of the way, we now know that we're reading
a line of contents material. At the start of the contents, this will be a
series of bibliographic data values; then there's a blank line, and then
we're into the section listing.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read regular contents material</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span>&lt;<span class="cwebmacro">End bibliographic data here, at the blank line</span> <span class="cwebmacronumber">7.3.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">in_biblio</span><span class="plain">) </span>&lt;<span class="cwebmacro">Read the bibliographic data block at the top</span> <span class="cwebmacronumber">7.3.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Read the roster of sections at the bottom</span> <span class="cwebmacronumber">7.3.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_1"></a><b>&#167;7.3.1. </b>At this point we've gone through the bibliographic lines at the top of the
contents page, and are soon going to read in the sections.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">End bibliographic data here, at the blank line</span> <span class="cwebmacronumber">7.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">in_biblio</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_2"></a><b>&#167;7.3.2. </b>The bibliographic data gives lines in any order specifying values of
variables with fixed names; a blank line ends the block.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the bibliographic data block at the top</span> <span class="cwebmacronumber">7.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">main_web_not_module</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?): (%c+?) *"</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">key</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="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">value</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">Set bibliographic key-value pair</span> <span class="cwebmacronumber">7.3.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"expected 'Setting: Value' but found '%S'"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</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">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_2_1"></a><b>&#167;7.3.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Set bibliographic key-value pair</span> <span class="cwebmacronumber">7.3.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Bibliographic::datum_on_or_off</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::ne_wide_string</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"On"</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Str::ne_wide_string</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Off"</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"this setting must be 'On' or 'Off': %S"</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="string">"Off"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"no such bibliographic datum: %S"</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_2">&#167;7.3.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3"></a><b>&#167;7.3.3. </b>In the bulk of the contents, we find indented lines for sections and
unindented ones for chapters.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the roster of sections at the bottom</span> <span class="cwebmacronumber">7.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">begins_with_white_space</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">) {</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">in_purpose</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">in_purpose</span><span class="plain"> == </span><span class="constant">TRUE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Record the purpose of the current chapter</span> <span class="cwebmacronumber">7.3.3.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Read about a new chapter</span> <span class="cwebmacronumber">7.3.3.2</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Read about, and read in, a new section</span> <span class="cwebmacronumber">7.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3_1"></a><b>&#167;7.3.3.1. </b>After a declared chapter heading, subsequent lines form its purpose, until
we reach a closed quote: we then stop, but remove the quotation marks. Because
we like a spoonful of syntactic sugar on our porridge, that's why.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Record the purpose of the current chapter</span> <span class="cwebmacronumber">7.3.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_last_char</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">)-1); </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">in_purpose</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">r</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain">-&gt;</span><span class="element">rubric</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">r</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">r</span><span class="plain">, </span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">r</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_3">&#167;7.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3_2"></a><b>&#167;7.3.3.2. </b>The title tells us everything we need to know about a chapter:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read about a new chapter</span> <span class="cwebmacronumber">7.3.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">); </span><span class="comment"> e.g., S, P, 1, 2, 3, A, B, ...</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">language_name</span><span class="plain"> = </span><span class="identifier">NULL</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*%C) %(Independent(%c*)%)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title_alone</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="identifier">language_name</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">Mark this chapter as an independent tangle target</span> <span class="cwebmacronumber">7.3.3.2.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">title_alone</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_is_a_chapter</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Sections"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">, </span><span class="string">"S"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">, </span><span class="string">"Sections"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">, </span><span class="string">"Sections.pdf"</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Preliminaries"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">, </span><span class="string">"P"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">, </span><span class="string">"Preliminaries"</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">, </span><span class="string">"%S."</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">, </span><span class="string">"Preliminaries.pdf"</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">TRUE</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Manual"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">, </span><span class="string">"M"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">, </span><span class="string">"Manual"</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">, </span><span class="string">"%S."</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">, </span><span class="string">"Manual.pdf"</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">TRUE</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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Header: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">path_to</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="identifier">NULL</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Headers"</span><span class="plain">);</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">HF</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</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="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">HF</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">header_filenames</span><span class="plain">);</span>
<span class="identifier">this_is_a_chapter</span><span class="plain"> = </span><span class="constant">FALSE</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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Import: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">import_from</span><span class="plain">) {</span>
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">imported</span><span class="plain"> =</span>
<span class="functiontext">WebModules::find</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">import_from</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="identifier">RS</span><span class="plain">-&gt;</span><span class="element">path_to_inweb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">imported</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"unable to find module: %S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</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">RS</span><span class="plain">-&gt;</span><span class="element">including_modules</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_syntax</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain">;</span>
<span class="functiontext">WebMetadata::read_contents_page</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">imported</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">import_from</span><span class="plain">,</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">scan_verbosely</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">including_modules</span><span class="plain">,</span>
<span class="identifier">imported</span><span class="plain">-&gt;</span><span class="identifier">module_location</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">path_to_inweb</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">default_syntax</span><span class="plain"> = </span><span class="identifier">save_syntax</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">this_is_a_chapter</span><span class="plain"> = </span><span class="constant">FALSE</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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter (%d+): %c+"</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Str::atoi</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="constant">0</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">, </span><span class="string">"Chapter %d"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">, </span><span class="string">"%S."</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">, </span><span class="string">"Chapter-%d.pdf"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">TRUE</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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Appendix (%c): %c+"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">letter</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="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">, </span><span class="identifier">letter</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">, </span><span class="string">"Appendix %S"</span><span class="plain">, </span><span class="identifier">letter</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">, </span><span class="string">"%S."</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">, </span><span class="string">"Appendix-%S.pdf"</span><span class="plain">, </span><span class="identifier">letter</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"segment not understood: %S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"(Must be 'Chapter &lt;number&gt;: Title', "</span>
<span class="string">"'Appendix &lt;letter A to O&gt;: Title',\n"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"'Manual', 'Preliminaries' or 'Sections')\n"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_is_a_chapter</span><span class="plain">) </span>&lt;<span class="cwebmacro">Create the new chapter with these details</span> <span class="cwebmacronumber">7.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">pdf_leafname</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_3">&#167;7.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3_2_1"></a><b>&#167;7.3.3.2.1. </b>A chapter whose title marks it as Independent becomes a new tangle target,
with the same language as the main web unless stated otherwise.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Mark this chapter as an independent tangle target</span> <span class="cwebmacronumber">7.3.3.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">language_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *"</span><span class="plain">))</span>
<span class="identifier">language_name</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Language"</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">language_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c*?) *"</span><span class="plain">))</span>
<span class="identifier">language_name</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="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_3_2">&#167;7.3.3.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_1"></a><b>&#167;7.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create the new chapter with these details</span> <span class="cwebmacronumber">7.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">chapter_md</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Nullity!\n"</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">line</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?): *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</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="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_decorated_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_decorated_title</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">rubric</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_language_name</span><span class="plain"> = </span><span class="identifier">language_name</span><span class="plain">;</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">imported</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">main_web_not_module</span><span class="plain">) </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="identifier">imported</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">reading_from</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain"> = </span><span class="identifier">Cm</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2">&#167;7.2</a>, <a href="#SP7_3_3_2">&#167;7.3.3.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2"></a><b>&#167;7.2.2. </b>That's enough on creating chapters. This is the more interesting business
of registering a new section within a chapter &mdash; more interesting because
we also read in and process its file.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read about, and read in, a new section</span> <span class="cwebmacronumber">7.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the section structure</span> <span class="cwebmacronumber">7.2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the section to the web and the current chapter</span> <span class="cwebmacronumber">7.2.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Work out the language and tangle target for the section</span> <span class="cwebmacronumber">7.2.2.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Work out the filename of this section file</span> <span class="cwebmacronumber">7.2.2.4</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2">&#167;7.2</a>, <a href="#SP7_3_3">&#167;7.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_1"></a><b>&#167;7.2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the section structure</span> <span class="cwebmacronumber">7.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain"> = </span><span class="identifier">filename_of_single_file_web</span><span class="plain">;</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain"> = </span><span class="identifier">syntax</span><span class="plain">;</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">is_a_singleton</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">titling_line_to_insert</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) %^\"(%c+)\" *"</span><span class="plain">)) {</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</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="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">tag_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">tag_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_2">&#167;7.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_2"></a><b>&#167;7.2.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the section to the web and the current chapter</span> <span class="cwebmacronumber">7.2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">section_count</span><span class="plain">++;</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">last_section</span><span class="plain"> = </span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">reading_from</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_2">&#167;7.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_3"></a><b>&#167;7.2.2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Work out the language and tangle target for the section</span> <span class="cwebmacronumber">7.2.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_language_name</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain">-&gt;</span><span class="element">ch_language_name</span><span class="plain">; </span><span class="comment"> by default</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*%C) %(Independent (%c*) *%)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title_alone</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">language_name</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">Mark this section as an independent tangle target</span> <span class="cwebmacronumber">7.2.2.3.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">, </span><span class="identifier">title_alone</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_2">&#167;7.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_3_1"></a><b>&#167;7.2.2.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Mark this section as an independent tangle target</span> <span class="cwebmacronumber">7.2.2.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">language_name</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="constant">0</span><span class="plain">) </span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Language"</span><span class="plain">);</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_independent_language</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</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="#SP7_2_2_3">&#167;7.2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_4"></a><b>&#167;7.2.2.4. </b>If we're told that a section is called "Bells and Whistles", what filename
is it stored in? Firstly, the leafname is normally <code class="display"><span class="extract">Bells and Whistles.w</span></code>,
but the extension used doesn't have to be <code class="display"><span class="extract">.w</span></code>: for Inform 6 template files,
the extension needs to be <code class="display"><span class="extract">.i6t</span></code>. We allow either.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out the filename of this section file</span> <span class="cwebmacronumber">7.2.2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname_to_use</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname_to_use</span><span class="plain">, </span><span class="string">"%S.i6t"</span><span class="plain">, </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">path_to</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="identifier">NULL</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">path_to_web</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">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_folder_name</span><span class="plain">);</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">leafname_to_use</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">leafname_to_use</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname_to_use</span><span class="plain">, </span><span class="string">"%S.w"</span><span class="plain">, </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">leafname_to_use</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname_to_use</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_2">&#167;7.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Relative pathnames or filenames. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebMetadata::directory_looks_like_a_web is used in 8/wm (<a href="8-wm.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function WebMetadata::contents_filename is used in <a href="#SP5_2">&#167;5.2</a>, <a href="#SP6_1">&#167;6.1</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Statistics. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::chapter_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">++;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::section_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">) {</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebMetadata::chapter_count appears nowhere else.</p>
<p class="endnote">The function WebMetadata::section_count appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 8: Literate Programming.)</i></li><li><a href="8-bdfw.html">Continue with 'Bibliographic Data for Webs'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>