inweb-bootstrap/docs/inweb/1-cnf.html
2020-04-05 18:37:43 +01:00

501 lines
80 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/pc</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/cnf' 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>Configuration</b></li></ul><p class="purpose">To parse the command line arguments with which inweb was called, and to handle any errors it needs to issue.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Instructions</a></li><li><a href="#SP2">&#167;2. Reading the command line</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Instructions. </b>The following structure exists just to hold what the user specified on the
command line: there will only ever be one of these.
</p>
<pre class="display">
<span class="identifier">typedef</span><span class="plain"> </span><span class="identifier">struct</span><span class="plain"> </span><span class="identifier">inweb_instructions</span><span class="plain"> {</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">; </span><span class="comment">our main mode of operation: one of the <code class="display"><span class="extract">*_MODE</span></code> constants</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">chosen_web</span><span class="plain">; </span><span class="comment">project folder relative to cwd</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">chosen_file</span><span class="plain">; </span><span class="comment">or, single file relative to cwd</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">chosen_range</span><span class="plain">; </span><span class="comment">which subset of this web we apply to (often, all of it)</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">chosen_range_actually_chosen</span><span class="plain">; </span><span class="comment">rather than being a default choice</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">swarm_mode</span><span class="plain">; </span><span class="comment">relevant to weaving only: one of the <code class="display"><span class="extract">*_SWARM</span></code> constants</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">tag_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-weave-tag X</span></code>: weave, but only the material tagged X</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">weave_format</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-weave-as X</span></code>: for example, <code class="display"><span class="extract">-weave-as TeX</span></code></span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">weave_pattern</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-weave-to X</span></code>: for example, <code class="display"><span class="extract">-weave-to HTML</span></code></span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">weave_docs</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-docs</span></code>: for GitHub Pages</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">show_languages_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-show-languages</span></code>: print list of available PLs</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">catalogue_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-catalogue</span></code>: print catalogue of sections</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">functions_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-functions</span></code>: print catalogue of functions within sections</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">structures_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-structures</span></code>: print catalogue of structures within sections</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">advance_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-advance-build</span></code>: advance build file for web</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">open_pdf_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-open-pdf</span></code>: open any woven PDF in the OS once it is made</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">scan_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-scan</span></code>: simply show the syntactic scan of the source</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">weave_to_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-weave-to X</span></code>: the pathname X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">weave_into_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-weave-into X</span></code>: the pathname X, if supplied</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">sequential</span><span class="plain">; </span><span class="comment">give the sections sequential sigils</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">tangle_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-tangle-to X</span></code>: the pathname X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">makefile_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-makefile X</span></code>: the filename X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">gitignore_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-gitignore X</span></code>: the filename X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">advance_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-advance-build-file X</span></code>: advance build file X</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">writeme_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-write-me X</span></code>: advance build file X</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">prototype_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-prototype X</span></code>: the pathname X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">navigation_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-navigation X</span></code>: the filename X, if supplied</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">breadcrumb_setting</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">breadcrumb_request</span></code></span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">verbose_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-verbose</span></code>: print names of files read to stdout</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">; </span><span class="comment">used only for parsing</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">import_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-import X</span></code>: where to find imported webs</span>
<span class="plain">} </span><span class="identifier">inweb_instructions</span><span class="plain">;</span>
<span class="identifier">typedef</span><span class="plain"> </span><span class="identifier">struct</span><span class="plain"> </span><span class="identifier">breadcrumb_request</span><span class="plain"> {</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">breadcrumb_text</span><span class="plain">;</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">breadcrumb_link</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="identifier">breadcrumb_request</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure inweb_instructions is accessed in 1/pc and here.</p>
<p class="endnote">The structure breadcrumb_request is accessed in 5/hf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Reading the command line. </b>The dull work of this is done by the Foundation module: all we need to do is
to enumerate constants for the Inweb-specific command line switches, and
then declare them.
</p>
<pre class="display">
<span class="identifier">inweb_instructions</span><span class="plain"> </span><span class="identifier">Configuration::read</span><span class="plain">(</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
<span class="identifier">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Initialise the args</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Declare the command-line switches specific to Inweb</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="identifier">CommandLine::read</span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">, &amp;</span><span class="identifier">args</span><span class="plain">, &amp;</span><span class="identifier">Configuration::switch</span><span class="plain">, &amp;</span><span class="identifier">Configuration::bareword</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_web</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_file</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">makefile_setting</span><span class="plain">) || (</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">gitignore_setting</span><span class="plain">))</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">inweb_mode</span><span class="plain"> = </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">)</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">inweb_mode</span><span class="plain"> = </span><span class="identifier">NO_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_range</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_range</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"0"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Configuration::read is used in 1/pc (<a href="1-pc.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the args</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">inweb_mode</span><span class="plain"> = </span><span class="identifier">NO_MODE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">swarm_mode</span><span class="plain"> = </span><span class="identifier">SWARM_OFF_SWM</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">show_languages_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">catalogue_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">functions_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">structures_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">advance_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">open_pdf_switch</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">scan_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">verbose_switch</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_web</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_range</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">chosen_range_actually_chosen</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">tangle_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">weave_to_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">weave_into_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">sequential</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">makefile_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">gitignore_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">advance_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">writeme_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">prototype_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">navigation_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">breadcrumb_setting</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">breadcrumb_request</span><span class="plain">);</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">tag_setting</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">weave_pattern</span><span class="plain"> = </span><span class="identifier">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"HTML"</span><span class="plain">);</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">weave_docs</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">import_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="identifier">targets</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b>The CommandLine section of Foundation needs to be told what command-line
switches we want, other than the standard set (such as <code class="display"><span class="extract">-help</span></code>) which it
provides automatically.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="identifier">VERBOSE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">IMPORT_FROM_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">LANGUAGES_CLSG</span>
<span class="definitionkeyword">enum</span> <span class="identifier">LANGUAGE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">LANGUAGES_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">SHOW_LANGUAGES_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">ANALYSIS_CLSG</span>
<span class="definitionkeyword">enum</span> <span class="identifier">CATALOGUE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">FUNCTIONS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">STRUCTURES_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">ADVANCE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">GITIGNORE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">MAKEFILE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WRITEME_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">ADVANCE_FILE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">PROTOTYPE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">SCAN_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVING_CLSG</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_INTO_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_TO_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">SEQUENTIAL_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">OPEN_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_AS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_TAG_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">WEAVE_DOCS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">BREADCRUMB_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">NAVIGATION_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">TANGLING_CLSG</span>
<span class="definitionkeyword">enum</span> <span class="identifier">TANGLE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="identifier">TANGLE_TO_CLSW</span>
</pre>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Declare the command-line switches specific to Inweb</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">CommandLine::declare_heading</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"inweb: a tool for literate programming\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">"Usage: inweb WEB OPTIONS RANGE\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">"WEB must be a directory holding a literate program (a 'web')\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">"The legal RANGEs are:\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" all: complete web (the default if no TARGETS set)\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" P: all preliminaries\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" 1: Chapter 1 (and so on)\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" A: Appendix A (and so on, up to Appendix O)\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" 3/eg: section with abbreviated name \</span><span class="plain">"</span><span class="string">3/eg\</span><span class="plain">"</span><span class="string"> (and so on)\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">"You can also, or instead, specify:\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" index: to weave an HTML page indexing the project\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" chapters: to weave all chapters as individual documents\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">" sections: ditto with sections\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">CommandLine::begin_group</span><span class="plain">(</span><span class="identifier">LANGUAGES_CLSG</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"for locating programming language definitions"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">LANGUAGE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"read-language"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"read language definition from file X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"read-languages"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"read all language definitions in path X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">SHOW_LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-languages"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"list programming languages supported by Inweb"</span><span class="plain">);</span>
<span class="identifier">CommandLine::end_group</span><span class="plain">();</span>
<span class="identifier">CommandLine::begin_group</span><span class="plain">(</span><span class="identifier">ANALYSIS_CLSG</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"for analysing a web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">CATALOGUE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"catalogue"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"list the sections in the web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">CATALOGUE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"catalog"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"same as '-catalogue'"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">MAKEFILE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"makefile"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"write a makefile for this web and store it in X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">GITIGNORE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"gitignore"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"write a .gitignore file for this web and store it in X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">ADVANCE_FILE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"advance-build-file"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"increment daily build code in file X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WRITEME_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"write-me"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"write a read-me file following instructions in file X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">PROTOTYPE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"prototype"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"translate makefile from prototype X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">FUNCTIONS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"functions"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"catalogue the functions in the web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">STRUCTURES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"structures"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"catalogue the structures in the web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">ADVANCE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"advance-build"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"increment daily build code for the web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">SCAN_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"scan"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"scan the web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::end_group</span><span class="plain">();</span>
<span class="identifier">CommandLine::begin_group</span><span class="plain">(</span><span class="identifier">WEAVING_CLSG</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"for weaving a web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_DOCS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave-docs"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave the web for use at GitHub Pages"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave the web into human-readable form"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_INTO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave-into"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave, but into directory X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave-to"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave, but to filename X (for single files only)"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="identifier">SEQUENTIAL_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sequential"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"name woven leaves with sequential numbering"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">OPEN_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"open"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave then open woven file"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_AS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave-as"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"set weave pattern to X (default is 'HTML')"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">WEAVE_TAG_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weave-tag"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"weave, but only using material tagged as X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">BREADCRUMB_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"breadcrumb"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"use the text X as a breadcrumb in overhead navigation"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">NAVIGATION_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"navigation"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"use the file X as a column of navigation links"</span><span class="plain">);</span>
<span class="identifier">CommandLine::end_group</span><span class="plain">();</span>
<span class="identifier">CommandLine::begin_group</span><span class="plain">(</span><span class="identifier">TANGLING_CLSG</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"for tangling a web"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">TANGLE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"tangle"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"tangle the web into machine-compilable form"</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">TANGLE_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"tangle-to"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"tangle, but to filename X"</span><span class="plain">);</span>
<span class="identifier">CommandLine::end_group</span><span class="plain">();</span>
<span class="identifier">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="identifier">VERBOSE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"verbose"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"explain what inweb is doing"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">CommandLine::declare_switch</span><span class="plain">(</span><span class="identifier">IMPORT_FROM_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"import-from"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"specify that imported modules are at pathname X"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Foundation calls this on any <code class="display"><span class="extract">-switch</span></code> argument read:
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="identifier">Configuration::switch</span><span class="plain">(</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="identifier">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="identifier">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="comment">Miscellaneous</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">VERBOSE_CLSW:</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">verbose_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">IMPORT_FROM_CLSW:</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">import_setting</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="comment">Analysis</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">LANGUAGE_CLSW:</span>
<span class="identifier">Languages::read_definition</span><span class="plain">(</span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">)); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">LANGUAGES_CLSW:</span>
<span class="identifier">Languages::read_definitions</span><span class="plain">(</span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">)); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">SHOW_LANGUAGES_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">show_languages_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">CATALOGUE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">catalogue_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">FUNCTIONS_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">functions_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">STRUCTURES_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">structures_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">ADVANCE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">advance_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">MAKEFILE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">makefile_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">)</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">GITIGNORE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">gitignore_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">)</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">ADVANCE_FILE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">advance_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WRITEME_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">writeme_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">PROTOTYPE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">prototype_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">TRANSLATE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">SCAN_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">scan_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">ANALYSE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="comment">Weave-related</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_CLSW:</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_DOCS_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">weave_docs</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_INTO_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">weave_into_setting</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_TO_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">weave_to_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">SEQUENTIAL_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">sequential</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">OPEN_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">open_pdf_switch</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_AS_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">weave_pattern</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">WEAVE_TAG_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">tag_setting</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">BREADCRUMB_CLSW:</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Configuration::breadcrumb</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">),</span>
<span class="identifier">breadcrumb_request</span><span class="plain">, </span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_setting</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">NAVIGATION_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">navigation_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">WEAVE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="comment">Tangle-related</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">TANGLE_CLSW:</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">TANGLE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">TANGLE_TO_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">tangle_setting</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">TANGLE_MODE</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unimplemented switch"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">breadcrumb_request</span><span class="plain"> *</span><span class="identifier">Configuration::breadcrumb</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="identifier">breadcrumb_request</span><span class="plain"> *</span><span class="identifier">BR</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="identifier">breadcrumb_request</span><span class="plain">);</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?): *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">BR</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_text</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">BR</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_link</span><span class="plain"> = </span><span class="identifier">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="identifier">else</span><span class="plain"> {</span>
<span class="identifier">BR</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_text</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">BR</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_link</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">BR</span><span class="plain">-&gt;</span><span class="identifier">breadcrumb_link</span><span class="plain">, </span><span class="string">".html"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">BR</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Configuration::switch is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">The function Configuration::breadcrumb appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Foundation calls this routine on any command-line argument which is
neither a switch (like <code class="display"><span class="extract">-weave</span></code>), nor an argument for a switch (like
the <code class="display"><span class="extract">X</span></code> in <code class="display"><span class="extract">-weave-as X</span></code>).
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="identifier">Configuration::bareword</span><span class="plain">(</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="identifier">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="identifier">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_web</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_file</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::suffix_eq</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".inweb"</span><span class="plain">, </span><span class="constant">6</span><span class="plain">))</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_file</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_web</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">);</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">Configuration::set_range</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">opt</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Configuration::bareword is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Here we read a range. The special ranges <code class="display"><span class="extract">index</span></code>, <code class="display"><span class="extract">chapters</span></code> and <code class="display"><span class="extract">sections</span></code>
are converted into swarm settings instead. <code class="display"><span class="extract">all</span></code> is simply an alias for <code class="display"><span class="extract">0</span></code>.
Otherwise, a range is a chapter number/letter, or a section range.
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="identifier">Configuration::set_range</span><span class="plain">(</span><span class="identifier">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">) {</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"index"</span><span class="plain">)) {</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">swarm_mode</span><span class="plain"> = </span><span class="identifier">SWARM_INDEX_SWM</span><span class="plain">;</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"chapters"</span><span class="plain">)) {</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">swarm_mode</span><span class="plain"> = </span><span class="identifier">SWARM_CHAPTERS_SWM</span><span class="plain">;</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sections"</span><span class="plain">)) {</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">swarm_mode</span><span class="plain"> = </span><span class="identifier">SWARM_SECTIONS_SWM</span><span class="plain">;</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">if</span><span class="plain"> (++</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">targets</span><span class="plain"> &gt; </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">Errors::fatal</span><span class="plain">(</span><span class="string">"at most one target may be given"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"all"</span><span class="plain">)) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_range</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"0"</span><span class="plain">);</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (((</span><span class="identifier">isalnum</span><span class="plain">(</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">))) &amp;&amp; (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">))</span>
<span class="plain">|| (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%i+/%i+"</span><span class="plain">))) {</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_range</span><span class="plain">, </span><span class="identifier">opt</span><span class="plain">);</span>
<span class="identifier">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Str::start</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_range</span><span class="plain">);</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">toupper</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)));</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"target not recognised (see -help for more): %S"</span><span class="plain">, </span><span class="identifier">opt</span><span class="plain">);</span>
<span class="identifier">Main::error_in_web</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">);</span>
<span class="identifier">exit</span><span class="plain">(1);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">chosen_range_actually_chosen</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">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">The function Configuration::set_range is used in <a href="#SP4">&#167;4</a>, 1/pc (<a href="1-pc.html#SP7_3_3">&#167;7.3.3</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We can only be in a single mode at a time:
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="identifier">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="identifier">NO_MODE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">))</span>
<span class="identifier">Errors::fatal</span><span class="plain">(</span><span class="string">"can only do one at a time - weaving, tangling or analysing"</span><span class="plain">);</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> = </span><span class="identifier">new_material</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Configuration::set_fundamental_mode is used in <a href="#SP3">&#167;3</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-pc.html">Back to 'Program Control'</a></li><li><a href="1-ptt.html">Continue with 'Patterns'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>