inweb-bootstrap/docs/inweb/1-pc.html
2020-04-02 13:30:38 +01:00

488 lines
56 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/bsc</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 '1/pc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#1">Chapter 1: Top Level</a></li><li><b>Program Control</b></li></ul><p class="purpose">The top level, which decides what is to be done and then carries this plan out.</p>
<ul class="toc"><li><a href="#SP6">&#167;6. Main routine</a></li><li><a href="#SP7">&#167;7. Following instructions</a></li><li><a href="#SP8">&#167;8. Error messages</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>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="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_inweb_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Inweb has a single fundamental mode of operation: on any given run, it
is either tangling, weaving or analysing. These processes use the same input
and parsing code, but then do very different things to produce their output,
so the fork in the road is not met until halfway through Inweb's execution.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">NO_MODE</span><span class="definitionkeyword"> from </span><span class="constant">0</span> <span class="comment">a special mode for doing nothing except printing command-line syntax</span>
<span class="definitionkeyword">enum</span> <span class="constant">ANALYSE_MODE</span><span class="plain"> </span> <span class="comment">for -scan, -catalogue, -functions and so on</span>
<span class="definitionkeyword">enum</span> <span class="constant">TANGLE_MODE</span><span class="plain"> </span> <span class="comment">for any form of -tangle</span>
<span class="definitionkeyword">enum</span> <span class="constant">WEAVE_MODE</span><span class="plain"> </span> <span class="comment">for any form of -weave</span>
<span class="definitionkeyword">enum</span> <span class="constant">TRANSLATE_MODE</span><span class="plain"> </span> <span class="comment">a special mode for translating a multi-web makefile</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fundamental_mode</span><span class="plain"> = </span><span class="constant">NO_MODE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This operation will be applied to a single web, and will apply to the whole
of that web unless we specify otherwise. Subsets of the web are represented by
short pieces of text called "ranges". This can be a section range like
<code class="display"><span class="extract">2/pine</span></code>, a chapter number like <code class="display"><span class="extract">12</span></code>, an appendix letter <code class="display"><span class="extract">A</span></code> or the
preliminaries block <code class="display"><span class="extract">P</span></code>, the special chapter <code class="display"><span class="extract">S</span></code> for the "Sections" chapter
of an unchaptered web, or the special value <code class="display"><span class="extract">0</span></code> to mean the entire web (which
is the default).
</p>
<p class="inwebparagraph">When weaving in "swarm mode", however, the user chooses a multiplicity of
operations rather than just one. Now it's no longer a matter of weaving a
particular section or chapter: we can weave all of the sections or chapters,
one after another.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">SWARM_OFF_SWM</span><span class="definitionkeyword"> from </span><span class="constant">0</span>
<span class="definitionkeyword">enum</span> <span class="constant">SWARM_INDEX_SWM</span><span class="plain"> </span> <span class="comment">make index(es) as if swarming, but don't actually swarm</span>
<span class="definitionkeyword">enum</span> <span class="constant">SWARM_CHAPTERS_SWM</span><span class="plain"> </span> <span class="comment">swarm the chapters</span>
<span class="definitionkeyword">enum</span> <span class="constant">SWARM_SECTIONS_SWM</span><span class="plain"> </span> <span class="comment">swarm the individual sections</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>In order to run, Inweb needs to know where it is installed &mdash; this
enables it to find its configuration file, the macros file, and so on.
Unless told otherwise on the command line, we'll assume Inweb is present
in the current working directory. The "materials" will then be in a further
subfolder called <code class="display"><span class="extract">Materials</span></code>.
</p>
<pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">where we are installed</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">the materials pathname</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_patterns</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">where built-in patterns are stored</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>We count the errors in order to be able to exit with a suitable exit code.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_inweb_errors</span><span class="plain"> = 0;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Main routine. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain"> = </span><span class="functiontext">Configuration::read</span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">);</span>
<span class="identifier">fundamental_mode</span><span class="plain"> = </span><span class="identifier">args</span><span class="element">.inweb_mode</span><span class="plain">;</span>
<span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="functiontext">Pathnames::installation_path</span><span class="plain">(</span><span class="string">"INWEB_PATH"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inweb"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">args</span><span class="element">.verbose_switch</span><span class="plain">) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Installation path is %p\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">path_to_inweb</span><span class="plain">);</span>
<span class="identifier">path_to_inweb_patterns</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Patterns"</span><span class="plain">);</span>
<span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Materials"</span><span class="plain">);</span>
<span class="functiontext">Main::follow_instructions</span><span class="plain">(&amp;</span><span class="identifier">args</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Shut inweb down</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in <a href="#SP7_2_2">&#167;7.2.2</a>, 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/cnf (<a href="1-cnf.html#SP1">&#167;1</a>), 4/cl (<a href="4-cl.html#SP3_4_2_5">&#167;3.4.2.5</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Foundation::start</span><span class="plain">();</span>
<span class="functiontext">Languages::create_programming_languages</span><span class="plain">();</span>
<span class="functiontext">Formats::create_weave_formats</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Shut inweb down</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Foundation::end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</span><span class="plain"> == 0)?0:1;</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. Following instructions. </b>This is the whole program in a nutshell, and it's a pretty old-school
program: some input, some thinking, a choice of three forms of output.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::follow_instructions</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">ins</span><span class="plain">) {</span>
<span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_web</span><span class="plain">) || (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_file</span><span class="plain">)) {</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="functiontext">Reader::load_web</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_web</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_file</span><span class="plain">,</span>
<span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;import_setting</span><span class="plain">), </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;verbose_switch</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;redirect_weaves_to</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">;</span>
<span class="functiontext">Reader::read_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;verbose_switch</span><span class="plain">);</span>
<span class="functiontext">Parser::parse_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</span><span class="plain"> == 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::follow_instructions is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>This is a one-off featurette:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"makescript.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"gitignorescript.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;writeme_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"READMEscript.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</span><span class="plain">)</span>
<span class="functiontext">Makefiles::write</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</span><span class="plain">,</span>
<span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;import_setting</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">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</span><span class="plain">)</span>
<span class="functiontext">Git::write_gitignore</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</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">ins</span><span class="plain">-</span><span class="element">&gt;advance_setting</span><span class="plain">)</span>
<span class="functiontext">BuildFiles::advance</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;advance_setting</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">ins</span><span class="plain">-</span><span class="element">&gt;writeme_setting</span><span class="plain">)</span>
<span class="functiontext">Readme::write</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;writeme_setting</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>But otherwise we do something with the given web:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Reader::print_web_statistics</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> == </span><span class="constant">ANALYSE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse the web</span> <span class="cwebmacronumber">7.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Tangle the web</span> <span class="cwebmacronumber">7.2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> == </span><span class="constant">WEAVE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave the web</span> <span class="cwebmacronumber">7.2.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_2_1"></a><b>&#167;7.2.1. </b>"Analysis" invokes any combination of the following diagnostic tools:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Analyse the web</span> <span class="cwebmacronumber">7.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;swarm_mode</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">)</span>
<span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"only specific parts of the web can be analysed"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;catalogue_switch</span><span class="plain">)</span>
<span class="functiontext">Analyser::catalogue_the_sections</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="constant">BASIC_SECTIONCAT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;functions_switch</span><span class="plain">)</span>
<span class="functiontext">Analyser::catalogue_the_sections</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="constant">FUNCTIONS_SECTIONCAT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;structures_switch</span><span class="plain">)</span>
<span class="functiontext">Analyser::catalogue_the_sections</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="constant">STRUCTURES_SECTIONCAT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</span><span class="plain">)</span>
<span class="functiontext">Analyser::write_makefile</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</span><span class="plain">,</span>
<span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;import_setting</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</span><span class="plain">)</span>
<span class="functiontext">Analyser::write_gitignore</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;advance_switch</span><span class="plain">)</span>
<span class="functiontext">BuildFiles::advance_for_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;scan_switch</span><span class="plain">)</span>
<span class="functiontext">Analyser::scan_line_categories</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</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>.</p>
<p class="inwebparagraph"><a id="SP7_2_2"></a><b>&#167;7.2.2. </b>We can tangle to any one of what might be several targets, numbered upwards
from 0. Target 0 always exists, and is the main program forming the web. For
many webs, this will in fact be the only target, but Inweb also allows
marked sections of a web to be independent targets &mdash; the idea here is to
allow an Appendix in the web to contain a configuration file, or auxiliary
program, needed for the main program to work; this might be written in a
quite different language from the rest of the web, and tangles to a different
output, but needs to be part of the web since it's essential to an understanding
of the whole system.
</p>
<p class="inwebparagraph">In this section we determine <code class="display"><span class="extract">tn</span></code>, the target number wanted, and <code class="display"><span class="extract">tangle_to</span></code>,
the filename of the tangled code to write. This may have been set at the command
line , but otherwise we impose a sensible choice based on the target.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Tangle the web</span> <span class="cwebmacronumber">7.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">);</span>
<span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">tn</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Work out main tangle destination</span> <span class="cwebmacronumber">7.2.2.1</span>&gt;<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">Reader::get_section_for_range</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.2.2.2</span>&gt;<span class="plain">;</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">tangle_leaf</span><span class="plain">) == 0) { </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"no tangle destination known"</span><span class="plain">); }</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">tangle_to</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;tangle_setting</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tangle_to</span><span class="plain"> == </span><span class="identifier">NULL</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="functiontext">Reader::tangled_folder</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">-</span><span class="element">&gt;single_file</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">-</span><span class="element">&gt;single_file</span><span class="plain">);</span>
<span class="identifier">tangle_to</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">tangle_leaf</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">tn</span><span class="plain"> = </span><span class="functiontext">Tangler::primary_target</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Tangler::go</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">tn</span><span class="plain">, </span><span class="identifier">tangle_to</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</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>.</p>
<p class="inwebparagraph"><a id="SP7_2_2_1"></a><b>&#167;7.2.2.1. </b>Here the target number is 0, and the tangle is of the main part of the web,
which for many small webs will be the entire thing.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out main tangle destination</span> <span class="cwebmacronumber">7.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">tn</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="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Short Title"</span><span class="plain">))</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Short Title"</span><span class="plain">));</span>
<span class="reserved">else</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Title"</span><span class="plain">));</span>
<span class="functiontext">Str::concatenate</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;main_language</span><span class="plain">-</span><span class="element">&gt;file_extension</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>If someone tangles, say, <code class="display"><span class="extract">2/eg</span></code> then the default filename is "Example Section".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Reader::get_section_for_range</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">);</span>
<span class="identifier">tn</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;sect_target</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"section cannot be independently tangled"</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">, </span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">-</span><span class="element">&gt;source_file_for_section</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_3"></a><b>&#167;7.2.3. </b>Weaving is not actually easier, it's just more thoroughly delegated:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave the web</span> <span class="cwebmacronumber">7.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_docs</span><span class="plain">) </span>&lt;<span class="cwebmacro">Prepare a docs weave</span> <span class="cwebmacronumber">7.2.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain"> = </span><span class="functiontext">Tags::find_by_name</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;tag_setting</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::len</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;tag_setting</span><span class="plain">) &gt; 0) &amp;&amp; (</span><span class="identifier">tag</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Errors::fatal_with_text</span><span class="plain">(</span><span class="string">"no such theme as '%S'"</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;tag_setting</span><span class="plain">);</span>
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain"> = </span><span class="functiontext">Patterns::find</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_pattern</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range_actually_chosen</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_file</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Configuration::set_range</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">-</span><span class="element">&gt;default_range</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext">Formats::begin_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;swarm_mode</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.2.3.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">shall_we_open</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;open_pdf_switch</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shall_we_open</span><span class="plain"> == </span><span class="constant">NOT_APPLICABLE</span><span class="plain">) { </span> <span class="comment">i.e., if it wasn't set at the command line</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">-</span><span class="element">&gt;open_command</span><span class="plain">) &gt; 0) </span><span class="identifier">shall_we_open</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">shall_we_open</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">tag</span><span class="plain">) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Tag!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Swarm::weave_subset</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="identifier">shall_we_open</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_to_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_docs</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;breadcrumb_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;navigation_setting</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Swarm::weave</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;swarm_mode</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_to_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_docs</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;breadcrumb_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;navigation_setting</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Formats::end_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</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>.</p>
<p class="inwebparagraph"><a id="SP7_2_3_1"></a><b>&#167;7.2.3.1. </b>If the <code class="display"><span class="extract">-weave-docs</span></code> option was used, we have to weave into a subfolder of
<code class="display"><span class="extract">docs</span></code>, and we'll create it if it doesn't already exist.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Prepare a docs weave</span> <span class="cwebmacronumber">7.2.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">docs</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">-</span><span class="element">&gt;path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"docs"</span><span class="plain">);</span>
<span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">docs</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leaf</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Short Title"</span><span class="plain">))</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Short Title"</span><span class="plain">));</span>
<span class="reserved">else</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Title"</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">leaf</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">docs</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain"> = </span><span class="identifier">docs</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;redirect_weaves_to</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">;</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_pattern</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"GitHubPages"</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_3">&#167;7.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_3_2"></a><b>&#167;7.2.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.2.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = 1;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::range_within</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;sect_range</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_range</span><span class="plain">))</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;printed_number</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">++;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2_3">&#167;7.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Error messages. </b>The Foundation module provides convenient functions to issue error messages,
but we'll use the following wrapper when issuing an error at a line of web
source:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">) {</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, &amp;(</span><span class="identifier">sl</span><span class="plain">-</span><span class="element">&gt;source</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">"%07d %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">sl</span><span class="plain">-</span><span class="element">&gt;source.line_count</span><span class="plain">, </span><span class="identifier">sl</span><span class="plain">-</span><span class="element">&gt;text</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">no_inweb_errors</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">&#167;5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">&#167;1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_6">&#167;1.1.6.6</a>, <a href="2-tp.html#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">&#167;3</a>), 2/ec (<a href="2-ec.html#SP3_1">&#167;3.1</a>, <a href="2-ec.html#SP3_2">&#167;3.2</a>, <a href="2-ec.html#SP3_3">&#167;3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">&#167;4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/pl (<a href="4-pl.html#SP10">&#167;10</a>), 4/cl (<a href="4-cl.html#SP3">&#167;3</a>, <a href="4-cl.html#SP3_1">&#167;3.1</a>, <a href="4-cl.html#SP3_4_2_1">&#167;3.4.2.1</a>, <a href="4-cl.html#SP3_4_2_5">&#167;3.4.2.5</a>, <a href="4-cl.html#SP22">&#167;22</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-bsc.html">Back to 'Basics'</a></li><li><a href="1-cnf.html">Continue with 'Configuration'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>