inweb-bootstrap/docs/inweb/2-tp.html
2020-04-12 17:24:23 +01:00

1205 lines
183 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>The Parser</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">Inweb Source</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>
<h2>Example Webs</h2>
<ul>
<li><a href="../goldbach/index.html">goldbach</a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'The Parser' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#2">Chapter 2: Parsing a Web</a></li><li><b>The Parser</b></li></ul><p class="purpose">To work through the program read in, assigning each line its category, and noting down other useful information as we go.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Sequence of parsing</a></li><li><a href="#SP1_1_6">&#167;1.1.6. Categorisatiom</a></li><li><a href="#SP3">&#167;3. Version errors</a></li><li><a href="#SP4">&#167;4. Footnote notation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Sequence of parsing. </b>At this point, thw web has been read into memory. It's a linked list of
chapters, each of which is a linked list of sections, each of which must
be parsed in turn.
</p>
<p class="inwebparagraph">When we're done, we offer the support code for the web's programming language
a chance to do some further work, if it wants to. (This is how, for example,
function definitions are recognised in C programs.) There is no requirement
for it to do anything.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::parse_web<button class="popup" onclick="togglePopup('usagePopup32')">...<span class="popuptext" id="usagePopup32">Usage of <b>Parser::parse_web</b>:<br>Program Control - <a href="1-pc.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sequential</span><span class="plain">) {</span>
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Parse a section</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="functiontext"><a href="4-lm.html#SP2">LanguageMethods::parse_types</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">main_language</span><span class="plain">);</span>
<span class="functiontext"><a href="4-lm.html#SP3">LanguageMethods::parse_functions</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">main_language</span><span class="plain">);</span>
<span class="functiontext"><a href="4-lm.html#SP4">LanguageMethods::further_parsing</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">main_language</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The task now is to parse those source lines, categorise them, and group them
further into a linked list of paragraphs. The basic method would be simple
enough, but is made more elaborate by supporting both version 1 and version 2
markup syntax, and trying to detect incorrect uses of one within the other.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse a section</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">NO_LCAT</span><span class="plain">,</span>
<span class="identifier">code_plainness_for_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">,</span>
<span class="identifier">hyperlink_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">before_bar</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_par_number</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tag_list</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">first_line</span><span class="plain">, *</span><span class="identifier">PL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">PL</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Apply tag list, if any</span> <span class="cwebmacronumber">1.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Remove tag list, if any</span> <span class="cwebmacronumber">1.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Detect implied paragraph breaks</span> <span class="cwebmacronumber">1.1.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Determine category for this source line</span> <span class="cwebmacronumber">1.1.6</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tag_list</span><span class="plain">);</span>
&lt;<span class="cwebmacro">In version 2 syntax, construe the comment under the heading as the purpose</span> <span class="cwebmacronumber">1.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">If the section as a whole is tagged, apply that tag to each paragraph in it</span> <span class="cwebmacronumber">1.1.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_1"></a><b>&#167;1.1.1. </b>In versiom 2 syntax, the notation for tags was clarified. The tag list
for a paragraph is the run of <code class="display"><span class="extract">^"This"</span></code> and <code class="display"><span class="extract">^"That"</span></code> markers at the end of
the line introducing that paragraph. They can only occur, therefore, on a
line beginning with an <code class="display"><span class="extract">@</span></code>. We extract them into a string called <code class="display"><span class="extract">tag_list</span></code>.
(The reason we can't act on them straight away, which would make for simpler
code, is that they need to be applied to a paragraph structure which doesn't
yet exist &mdash; it will only exist when the line has been fully parsed.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove tag list, if any</span> <span class="cwebmacronumber">1.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)( *%^\"%c+?\")(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"tags written ^\"thus\""</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tag_list</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_2"></a><b>&#167;1.1.2. </b>And now it's later, and we can safely apply the tags. <code class="display"><span class="extract">current_paragraph</span></code>
now points to the para which was created by this line, not the one before.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Apply tag list, if any</span> <span class="cwebmacronumber">1.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">tag_list</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%^\"(%c+?)\" *(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="2-tgs.html#SP4">Tags::add_by_name</a></span><span class="plain">(</span><span class="identifier">current_paragraph</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">tag_list</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">tag_list</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_3"></a><b>&#167;1.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">If the section as a whole is tagged, apply that tag to each paragraph in it</span> <span class="cwebmacronumber">1.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">tag_with</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">paragraphs</span><span class="plain">)</span>
<span class="functiontext"><a href="2-tgs.html#SP3">Tags::add_to_paragraph</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">tag_with</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_4"></a><b>&#167;1.1.4. </b>The "purpose" of a section is a brief note about what it's for. In version 1
syntax, this had to be explicitly declared with a <code class="display"><span class="extract">@Purpose:</span></code> command; in
version 2 it's much tidier.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">In version 2 syntax, construe the comment under the heading as the purpose</span> <span class="cwebmacronumber">1.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">) {</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">first_line</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">) &amp;&amp; (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_purpose</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">Parser::extract_purpose</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">?</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">next_line:</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">S</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"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_purpose</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">PURPOSE_LCAT</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_5"></a><b>&#167;1.1.5. </b>A new paragraph is implied when a macro definition begins in the middle of
what otherwise would be code, or when a paragraph and its code divider are
immediately adjacent on the same line.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Detect implied paragraph breaks</span> <span class="cwebmacronumber">1.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">PL</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="constant">1</span><span class="plain">) == </span><span class="character">'&lt;'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c&lt;(%c+)@&gt; *= *"</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Insert an implied paragraph break</span> <span class="cwebmacronumber">1.1.5.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PL</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@ *= *"</span><span class="plain">))) {</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"="</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"implied paragraph breaks"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Insert an implied paragraph break</span> <span class="cwebmacronumber">1.1.5.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_5_1"></a><b>&#167;1.1.5.1. </b>We handle implied paragraph dividers by inserting a paragraph marker and
reparsing from there.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Insert an implied paragraph break</span> <span class="cwebmacronumber">1.1.5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">NL</span><span class="plain"> = </span><span class="functiontext"><a href="2-lc.html#SP2">Lines::new_source_line_in</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"@"</span><span class="plain">, &amp;(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">source</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">PL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">NL</span><span class="plain">;</span>
<span class="identifier">NL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">PL</span><span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_5">&#167;1.1.5</a> (twice).</p>
<p class="inwebparagraph"><a id="SP1_1_6"></a><b>&#167;1.1.6. Categorisatiom. </b>This is where the work is really done. We have a source line: is it comment,
code, definition, what?
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Determine category for this source line</span> <span class="cwebmacronumber">1.1.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="identifier">comment_mode</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">; </span><span class="comment"> until set otherwise down below</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain"> = </span><span class="identifier">current_paragraph</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">source</span><span class="plain">.</span><span class="element">line_count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span>&lt;<span class="cwebmacro">Parse the line as a probable chapter heading</span> <span class="cwebmacronumber">1.1.6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">source</span><span class="plain">.</span><span class="element">line_count</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span>&lt;<span class="cwebmacro">Parse the line as a probable section heading</span> <span class="cwebmacronumber">1.1.6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the line as a possible Inweb command</span> <span class="cwebmacronumber">1.1.6.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the line as a possible paragraph macro definition</span> <span class="cwebmacronumber">1.1.6.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'='</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"column-1 '=' as code divider"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">extract_mode</span><span class="plain">) </span>&lt;<span class="cwebmacro">Exit extract mode</span> <span class="cwebmacronumber">1.1.6.6</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Parse the line as an equals structural marker</span> <span class="cwebmacronumber">1.1.6.7</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="constant">1</span><span class="plain">) != </span><span class="character">'&lt;'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> != </span><span class="constant">MACRO_DEFINITION_LCAT</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Parse the line as a structural marker</span> <span class="cwebmacronumber">1.1.6.5</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">comment_mode</span><span class="plain">) </span>&lt;<span class="cwebmacro">This is a line destined for commentary</span> <span class="cwebmacronumber">1.1.6.8</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">comment_mode</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">This is a line destined for the verbatim code</span> <span class="cwebmacronumber">1.1.6.9</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_1"></a><b>&#167;1.1.6.1. </b>This must be one of the inserted lines marking chapter headings; it doesn't
come literally from the source web.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as a probable chapter heading</span> <span class="cwebmacronumber">1.1.6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter Heading"</span><span class="plain">)) {</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_2"></a><b>&#167;1.1.6.2. </b>The top line of a section gives its title; in InC, it can also give the
namespace for its functions.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as a probable section heading</span> <span class="cwebmacronumber">1.1.6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[(%C+)%] (%C+/%C+): (%c+)."</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">,</span>
<span class="string">"section range in header line"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C+/%C+): (%c+)."</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">,</span>
<span class="string">"section range in header line"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[(%C+::)%] (%c+)."</span><span class="plain">)) {</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+)."</span><span class="plain">)) {</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_3"></a><b>&#167;1.1.6.3. </b>Version 1 syntax was cluttered up with a number of hardly-used markup
syntaxes called "commands", written in double squared brackets <code class="display"><span class="extract">[[Thus]]</span></code>.
In version 2, this notation is never used.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as a possible Inweb command</span> <span class="cwebmacronumber">1.1.6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[%[(%c+)%]%]"</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">full_command</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">full_command</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMAND_LCAT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?): *(%c+)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Page Break"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[Page Break]]"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">PAGEBREAK_CMD</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Grammar Index"</span><span class="plain">))</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">GRAMMAR_INDEX_CMD</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Tag"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[Tag...]]"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="functiontext"><a href="2-tgs.html#SP4">Tags::add_by_name</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">TAG_CMD</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Figure"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[Figure...]]"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="functiontext"><a href="2-tgs.html#SP4">Tags::add_by_name</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">FIGURE_CMD</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown [[command]]"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">full_command</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_4"></a><b>&#167;1.1.6.4. </b>Some paragraphs define angle-bracketed macros, and those need special
handling. We'll call these "paragraph macros".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as a possible paragraph macro definition</span> <span class="cwebmacronumber">1.1.6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="constant">1</span><span class="plain">) == </span><span class="character">'&lt;'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c&lt;(%c+)@&gt; *= *"</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">para_macro_name</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">para_macro_name</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">MACRO_DEFINITION_LCAT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_paragraph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"&lt;...&gt; definition begins outside of a paragraph"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="2-pm.html#SP2">Macros::create</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">current_paragraph</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">para_macro_name</span><span class="plain">);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span><span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">; </span><span class="comment"> code follows on subsequent lines</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">code_plainness_for_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">hyperlink_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">para_macro_name</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5"></a><b>&#167;1.1.6.5. </b>A structural marker is introduced by an <code class="display"><span class="extract">@</span></code> in column 1, and is a structural
division in the current section.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as a structural marker</span> <span class="cwebmacronumber">1.1.6.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP24">Str::delete_first_character</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">); </span><span class="comment"> i.e., strip the at-sign from the front</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C*) *(%c*?)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Deal with a structural marker</span> <span class="cwebmacronumber">1.1.6.5.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">);</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_6"></a><b>&#167;1.1.6.6. </b>An equals sign in column 1 can just mean the end of an extract, so:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Exit extract mode</span> <span class="cwebmacronumber">1.1.6.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">END_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_7"></a><b>&#167;1.1.6.7. </b>But more usually an equals sign in column 1 is a structural marker:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the line as an equals structural marker</span> <span class="cwebmacronumber">1.1.6.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BEGIN_CODE_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr2</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"= *(%c+) *"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"(very early code)"</span><span class="plain">))) {</span>
<span class="identifier">current_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_very_early</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"(early code)"</span><span class="plain">))) {</span>
<span class="identifier">current_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_early</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text as code%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">;</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text as (%c+)%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="functiontext"><a href="4-pl.html#SP2">Languages::find_by_name</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text from (%c+) as code%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</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="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text from (%c+) as (%c+)%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="functiontext"><a href="4-pl.html#SP2">Languages::find_by_name</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2], </span><span class="identifier">W</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</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="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%((%c*?) *text from (%c+)%)"</span><span class="plain">))) {</span>
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</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="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%(figure (%c+)%)"</span><span class="plain">))) {</span>
<span class="functiontext"><a href="2-tgs.html#SP4">Tags::add_by_name</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">FIGURE_CMD</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMAND_LCAT</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%(embedded (%C+) video (%c+)%)"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"%(embedded (%C+) audio (%c+)%)"</span><span class="plain">)))) {</span>
<span class="functiontext"><a href="2-tgs.html#SP4">Tags::add_by_name</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">EMBED_CMD</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMAND_LCAT</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown bracketed annotation"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"= *%C%c*"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown material after '='"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">code_plainness_for_body</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain">;</span>
<span class="identifier">hyperlink_body</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">enable_hyperlinks</span><span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_7_1"></a><b>&#167;1.1.6.7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr3</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="constant">TRUE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr3</span><span class="plain">, </span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">" *(%C+) *(%c*?)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">mr3</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"undisplayed"</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</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="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">mr3</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"hyperlinked"</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">enable_hyperlinks</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="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span>
<span class="identifier">I</span><span class="string">"only 'undisplayed' and/or 'hyperlinked' can precede 'text' here"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr3</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr3</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_7">&#167;1.1.6.7</a> (6 times).</p>
<p class="inwebparagraph"><a id="SP1_1_6_7_2"></a><b>&#167;1.1.6.7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BEGIN_CODE_LCAT</span><span class="plain">;</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP3">Filenames::from_text_relative</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">lines</span><span class="plain"> = </span><span class="functiontext"><a href="4-tp.html#SP7">Painter::lines</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">;</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">latest</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain">, </span><span class="identifier">lines</span><span class="plain">) {</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">TL</span><span class="plain"> = </span><span class="functiontext"><a href="2-lc.html#SP2">Lines::new_source_line_in</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, &amp;(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">source</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">TL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">latest</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="identifier">TL</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain">;</span>
<span class="identifier">latest</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">TL</span><span class="plain">;</span>
<span class="identifier">latest</span><span class="plain"> = </span><span class="identifier">TL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">EEL</span><span class="plain"> = </span><span class="functiontext"><a href="2-lc.html#SP2">Lines::new_source_line_in</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"="</span><span class="plain">, &amp;(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">source</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">EEL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">latest</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="identifier">latest</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain"> = </span><span class="identifier">EEL</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="identifier">extract_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_7">&#167;1.1.6.7</a> (three times).</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1"></a><b>&#167;1.1.6.5.1. </b>So here we have the possibilities which start with a column-1 <code class="display"><span class="extract">@</span></code> sign.
There appear to be hordes of these, but in fact most of them were removed
in Inweb syntax version 2: in modern syntax, only <code class="display"><span class="extract">@d</span></code>, <code class="display"><span class="extract">@e</span></code>, <code class="display"><span class="extract">@h</span></code>, their
long forms <code class="display"><span class="extract">@define</span></code>, <code class="display"><span class="extract">@enum</span></code> and <code class="display"><span class="extract">@heading</span></code>, and plain old <code class="display"><span class="extract">@</span></code> remain.
(But <code class="display"><span class="extract">@e</span></code> has a different meaning from in version 1.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with a structural marker</span> <span class="cwebmacronumber">1.1.6.5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">extract_mode</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"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Purpose:"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with Purpose</span> <span class="cwebmacronumber">1.1.6.5.1.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Interface:"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with Interface</span> <span class="cwebmacronumber">1.1.6.5.1.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Definitions:"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with Definitions</span> <span class="cwebmacronumber">1.1.6.5.1.3</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"----+"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with the bar</span> <span class="cwebmacronumber">1.1.6.5.1.4</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"c"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"x"</span><span class="plain">)) ||</span>
<span class="plain">((</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain"> == </span><span class="constant">V1_SYNTAX</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"e"</span><span class="plain">))))</span>
&lt;<span class="cwebmacro">Deal with the code and extract markers</span> <span class="cwebmacronumber">1.1.6.5.1.5</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"d"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with the define marker</span> <span class="cwebmacronumber">1.1.6.5.1.6</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"define"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@define' for definitions (use '@d' instead)"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Deal with the define marker</span> <span class="cwebmacronumber">1.1.6.5.1.6</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"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"default"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@default' for definitions"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">default_defn</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with the define marker</span> <span class="cwebmacronumber">1.1.6.5.1.6</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"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"enum"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Deal with the enumeration marker</span> <span class="cwebmacronumber">1.1.6.5.1.7</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"e"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Deal with the enumeration marker</span> <span class="cwebmacronumber">1.1.6.5.1.7</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain"> = -1, </span><span class="identifier">new_page</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"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">)) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">ORDINARY_WEIGHT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"h"</span><span class="plain">)) || (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"heading"</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@h' or '@heading' for headings (use '@p' instead)"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="identifier">weight</span><span class="plain"> = </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"p"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@p' for headings (use '@h' instead)"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">weight</span><span class="plain"> = </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"pp"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@pp' for super-headings"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">weight</span><span class="plain"> = </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">; </span><span class="identifier">new_page</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span>&lt;<span class="cwebmacro">Begin a new paragraph of this weight</span> <span class="cwebmacronumber">1.1.6.5.1.8</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"don't understand @command"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5">&#167;1.1.6.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_1"></a><b>&#167;1.1.6.5.1.1. </b>In version 1 syntax there were some peculiar special headings above a divider
in the file made of hyphens, called "the bar". All of that has gone in V2.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with Purpose</span> <span class="cwebmacronumber">1.1.6.5.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Purpose used after bar"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@Purpose'"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">PURPOSE_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_purpose</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">Parser::extract_purpose</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, &amp;</span><span class="identifier">L</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_2"></a><b>&#167;1.1.6.5.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with Interface</span> <span class="cwebmacronumber">1.1.6.5.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@Interface'"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Interface used after bar"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">INTERFACE_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">XL</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">XL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) &amp;&amp; (</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">INTERFACE_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain"> = </span><span class="identifier">XL</span><span class="plain">;</span>
<span class="identifier">XL</span><span class="plain"> = </span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_3"></a><b>&#167;1.1.6.5.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with Definitions</span> <span class="cwebmacronumber">1.1.6.5.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@Definitions' headings"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Definitions used after bar"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">DEFINITIONS_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">before_bar</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">next_par_number</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_4"></a><b>&#167;1.1.6.5.1.4. </b>An <code class="display"><span class="extract">@</span></code> sign in the first column, followed by a row of four or more dashes,
constitutes the optional division bar in a section.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the bar</span> <span class="cwebmacronumber">1.1.6.5.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"the bar '----...'"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"second bar in the same section"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BAR_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">barred</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">before_bar</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">next_par_number</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_5"></a><b>&#167;1.1.6.5.1.5. </b>In version 1, the division point where a paragraoh begins to go into
verbatim code was not marked with an equals sign, but with one of the three
commands <code class="display"><span class="extract">@c</span></code> ("code"), <code class="display"><span class="extract">@e</span></code> ("early code") and <code class="display"><span class="extract">@x</span></code> ("code-like extract").
These had identical behaviour except for whether or not to tangle what
follows:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the code and extract markers</span> <span class="cwebmacronumber">1.1.6.5.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext"><a href="#SP3">Parser::wrong_version</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"'@c' and '@x'"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BEGIN_CODE_LCAT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"e"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">current_paragraph</span><span class="plain">))</span>
<span class="identifier">current_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_early</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP21">Str::eq_wide_string</a></span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"x"</span><span class="plain">)) </span><span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">code_plainness_for_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">hyperlink_body</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_6"></a><b>&#167;1.1.6.5.1.6. </b>This is for <code class="display"><span class="extract">@d</span></code> and <code class="display"><span class="extract">@define</span></code>. Definitions are intended to translate to
C preprocessor macros, Inform 6 <code class="display"><span class="extract">Constant</span></code>s, and so on.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the define marker</span> <span class="cwebmacronumber">1.1.6.5.1.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">CONT_DEFINITION_LCAT</span><span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">remainder</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C+) (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]); </span><span class="comment"> name of term defined</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]); </span><span class="comment"> Value</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">); </span><span class="comment"> name of term defined</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">(); </span><span class="comment"> no value given</span>
<span class="plain">}</span>
<span class="functiontext"><a href="3-ta.html#SP10">Analyser::mark_reserved_word_at_line</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a> (three times).</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_7"></a><b>&#167;1.1.6.5.1.7. </b>This is for <code class="display"><span class="extract">@e</span></code> (in version 2) and <code class="display"><span class="extract">@enum</span></code>, which makes an automatically
enumerated sort of <code class="display"><span class="extract">@d</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the enumeration marker</span> <span class="cwebmacronumber">1.1.6.5.1.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">); </span><span class="comment"> name of term defined</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-lm.html#SP6">LanguageMethods::parse_comment</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">,</span>
<span class="identifier">before</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">)) {</span>
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C+) from (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">from</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="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text_operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C+) (%c+)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"enumeration constants can't supply a value"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">)</span>
<span class="functiontext"><a href="2-ec.html#SP3">Enumerations::define</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext"><a href="3-ta.html#SP10">Analyser::mark_reserved_word_at_line</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_8"></a><b>&#167;1.1.6.5.1.8. </b>Here we handle paragraph breaks which may or may not be headings. In
version 1, <code class="display"><span class="extract">@p</span></code> was a heading, and <code class="display"><span class="extract">@pp</span></code> a grander heading, while plain <code class="display"><span class="extract">@</span></code>
is no heading at all. The use of "p" was a little confusing, and went back
to CWEB, which used the term "paragraph" differently from us: it was "p"
short for what CWEB called a "paragraph". We now use <code class="display"><span class="extract">@h</span></code> or equivalently
<code class="display"><span class="extract">@heading</span></code> for a heading.
</p>
<p class="inwebparagraph">The noteworthy thing here is the way we fool around with the text on the line
of the paragraph opening. This is one of the few cases where Inweb has
retained the stream-based style of CWEB, where escape characters can appear
anywhere in a line and line breaks are not significant. Thus
</p>
<pre class="display">
<span class="plain">@h The chronology of French weaving. Auguste de Papillon (1734-56) soon</span>
</pre>
<p class="inwebparagraph">is split into two, so that the title of the paragraph is just "The chronology
of French weaving" and the remainder,
</p>
<pre class="display">
<span class="plain">Auguste de Papillon (1734-56) soon</span>
</pre>
<p class="inwebparagraph">will be woven exactly as the succeeding lines will be.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">ORDINARY_WEIGHT</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> </span><span class="comment"> an ordinary paragraph has this "weight"</span>
<span class="definitionkeyword">define</span> <span class="constant">SUBHEADING_WEIGHT</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="comment"> a heading paragraph</span>
</pre>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Begin a new paragraph of this weight</span> <span class="cwebmacronumber">1.1.6.5.1.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">PARAGRAPH_START_LCAT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">) </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">HEADING_START_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">(); </span><span class="comment"> title</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">remainder</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+). (%c+)"</span><span class="plain">))) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">SUBHEADING_WEIGHT</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">remainder</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+). *"</span><span class="plain">))) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">remainder</span><span class="plain">);</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Create a new paragraph, starting here, as new current paragraph</span> <span class="cwebmacronumber">1.1.6.5.1.8.2</span>&gt;<span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain"> = </span><span class="identifier">current_paragraph</span><span class="plain">;</span>
<span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">no_paragraphs</span><span class="plain">++;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_8_1"></a><b>&#167;1.1.6.5.1.8.1. </b>So now it's time to create paragraph structures:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">paragraph</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">above_bar</span><span class="plain">; </span><span class="comment"> placed above the dividing bar in its section (in Version 1 syntax)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placed_early</span><span class="plain">; </span><span class="comment"> should appear early in the tangled code</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placed_very_early</span><span class="plain">; </span><span class="comment"> should appear very early in the tangled code</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ornament</span><span class="plain">; </span><span class="comment"> a "P" for a pilcrow or "S" for section-marker</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">paragraph_number</span><span class="plain">; </span><span class="comment"> used in combination with the ornament</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_child_number</span><span class="plain">; </span><span class="comment"> used when working out paragraph numbers</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">parent_paragraph</span><span class="plain">; </span><span class="comment"> ditto</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">; </span><span class="comment"> typographic prominence: one of the <code class="display"><span class="extract">*_WEIGHT</span></code> values</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">starts_on_new_page</span><span class="plain">; </span><span class="comment"> relevant for weaving to TeX only, of course</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">defines_macro</span><span class="plain">; </span><span class="comment"> there can only be one</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">functions</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">function</span></code>: those defined in this para</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">structures</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">language_type</span></code>: similarly</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">taggings</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">paragraph_tagging</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">first_line_in_paragraph</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">under_section</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">paragraph</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure paragraph is accessed in 2/pm, 2/tgs, 2/pn, 3/tw, 3/tt, 4/taf, 4/cl, 4/is, 5/ptf, 5/tf, 5/hf and here.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_8_2"></a><b>&#167;1.1.6.5.1.8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create a new paragraph, starting here, as new current paragraph</span> <span class="cwebmacronumber">1.1.6.5.1.8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">paragraph</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">) {</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">above_bar</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">placed_early</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">placed_very_early</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">above_bar</span><span class="plain"> = </span><span class="identifier">before_bar</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">placed_early</span><span class="plain"> = </span><span class="identifier">before_bar</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">placed_very_early</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">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain"> == </span><span class="constant">V1_SYNTAX</span><span class="plain">) &amp;&amp; (</span><span class="identifier">before_bar</span><span class="plain">))</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"P"</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"S"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">next_par_number</span><span class="plain">++);</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">parent_paragraph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">next_child_number</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">starts_on_new_page</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">weight</span><span class="plain"> = </span><span class="identifier">weight</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">first_line_in_paragraph</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">defines_macro</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">functions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">function</span><span class="plain">);</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">structures</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">language_type</span><span class="plain">);</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">taggings</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">paragraph_tagging</span><span class="plain">);</span>
<span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_paragraphs</span><span class="plain">++;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">paragraphs</span><span class="plain">);</span>
<span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6_5_1_8">&#167;1.1.6.5.1.8</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_8"></a><b>&#167;1.1.6.8. </b>Finally, we're down to either commentary or code.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">This is a line destined for commentary</span> <span class="cwebmacronumber">1.1.6.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&gt;&gt; (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">SOURCE_DISPLAY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_6_9"></a><b>&#167;1.1.6.9. </b>Note that in an <code class="display"><span class="extract">@d</span></code> definition, a blank line is treated as the end of the
definition. (This is unnecessary for C, and is a point of difference with
CWEB, but is needed for languages which don't allow multi-line definitions.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">This is a line destined for the verbatim code</span> <span class="cwebmacronumber">1.1.6.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> != </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">) &amp;&amp; (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> != </span><span class="constant">COMMAND_LCAT</span><span class="plain">)) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="identifier">code_lcat_for_body</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain"> = </span><span class="identifier">code_plainness_for_body</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">enable_hyperlinks</span><span class="plain"> = </span><span class="identifier">hyperlink_body</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">) </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">colour_as</span><span class="plain"> = </span><span class="identifier">code_pl_for_body</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CONT_DEFINITION_LCAT</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-pm.html#SP5">Regexp::string_is_white_space</a></span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">))) {</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-lm.html#SP5">LanguageMethods::subcategorise_line</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1_6">&#167;1.1.6</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The purpose text occurs just below the heading. In version 1 it's cued with
a <code class="display"><span class="extract">@Purpose:</span></code> command; in version 2 it is unmarked. The following routine
is not elegant but handles the back end of both possibilities.
</p>
<pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Parser::extract_purpose<button class="popup" onclick="togglePopup('usagePopup33')">...<span class="popuptext" id="usagePopup33">Usage of <b>Parser::extract_purpose</b>:<br><a href="#SP1_1_4">&#167;1.1.4</a>, <a href="#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prologue</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">XL</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> **</span><span class="identifier">adjust</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">prologue</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">XL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) &amp;&amp; (</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(((</span><span class="identifier">adjust</span><span class="plain">) &amp;&amp; (</span><span class="identifier">isalnum</span><span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">)))) ||</span>
<span class="plain"> ((!</span><span class="identifier">adjust</span><span class="plain">) &amp;&amp; (</span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">)))) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">PURPOSE_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">adjust</span><span class="plain">) *</span><span class="identifier">adjust</span><span class="plain"> = </span><span class="identifier">XL</span><span class="plain">;</span>
<span class="identifier">XL</span><span class="plain"> = </span><span class="identifier">XL</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Version errors. </b>These are not fatal (why should they be?): Inweb carries on and allows the use
of the feature despite the version mismatch. They nevertheless count as errors
when it comes to Inweb's exit code, so they will halt a make.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::wrong_version<button class="popup" onclick="togglePopup('usagePopup34')">...<span class="popuptext" id="usagePopup34">Usage of <b>Parser::wrong_version</b>:<br><a href="#SP1_1_1">&#167;1.1.1</a>, <a href="#SP1_1_5">&#167;1.1.5</a>, <a href="#SP1_1_6">&#167;1.1.6</a>, <a href="#SP1_1_6_2">&#167;1.1.6.2</a>, <a href="#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="#SP1_1_6_5_1_5">&#167;1.1.6.5.1.5</a>, The Weaver - <a href="3-tw.html#SP1_3_4_1_2_1">&#167;1.3.4.1.2.1</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">using</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">feature</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">need</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">warning</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">warning</span><span class="plain">, </span><span class="string">"%s is a feature available only in version %d syntax (you're using version %d)"</span><span class="plain">,</span>
<span class="identifier">feature</span><span class="plain">, </span><span class="identifier">need</span><span class="plain">, </span><span class="identifier">using</span><span class="plain">);</span>
<span class="functiontext"><a href="1-pc.html#SP8">Main::error_in_web</a></span><span class="plain">(</span><span class="identifier">warning</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">warning</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Footnote notation. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Parser::detect_footnote<button class="popup" onclick="togglePopup('usagePopup35')">...<span class="popuptext" id="usagePopup35">Usage of <b>Parser::detect_footnote</b>:<br>The Weaver - <a href="3-tw.html#SP1_3_4_1_8_5">&#167;1.3.4.1.8.5</a><br>Format Methods - <a href="5-fm.html#SP27_3">&#167;27.3</a></span></button></span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">before</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cue</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">after</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">fn_on_notation</span><span class="plain"> =</span>
<span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Footnote Begins Notation"</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">fn_off_notation</span><span class="plain"> =</span>
<span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Footnote Ends Notation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::ne</a></span><span class="plain">(</span><span class="identifier">fn_on_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N1</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">fn_on_notation</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">fn_off_notation</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N1</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">N2</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">))</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP25">Str::includes_at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">fn_on_notation</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N1</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt; </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP25">Str::includes_at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">fn_off_notation</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">b</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP25">Str::substr</a></span><span class="plain">(</span><span class="identifier">b</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP10">Str::start</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">), </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="functiontext"><a href="4-sm.html#SP25">Str::substr</a></span><span class="plain">(</span><span class="identifier">c</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N1</span><span class="plain">), </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="functiontext"><a href="4-sm.html#SP25">Str::substr</a></span><span class="plain">(</span><span class="identifier">a</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N2</span><span class="plain">), </span><span class="functiontext"><a href="4-sm.html#SP10">Str::end</a></span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-chr.html#SP1">Characters::isdigit</a></span><span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="identifier">allow</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="identifier">allow</span><span class="plain">) {</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">before</span><span class="plain">); </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">b</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">cue</span><span class="plain">); </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">cue</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">after</span><span class="plain">); </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">a</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">b</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">allow</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-lc.html">Back to 'Line Categories'</a></li><li><a href="2-pm.html">Continue with 'Paragraph Macros'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</main>
</body>
</html>