1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/indoc/3-cai.html
2020-03-28 19:42:53 +00:00

1052 lines
157 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/iu</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html"><b>other tools</b></a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Other Tools</h2>
<ul>
<li><a href="../inblorb/index.html">inblorb</a></li>
<li><a href="../indoc/index.html">indoc</a></li>
<li><a href="../inpolicy/index.html">inpolicy</a></li>
<li><a href="../inrtps/index.html">inrtps</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '3/cai' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">indoc</a></li><li><a href="index.html#3">Chapter 3: Indexing</a></li><li><b>Contents and Indexes</b></li></ul><p class="purpose">To produce a general index, for HTML output only.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Indexing notations</a></li><li><a href="#SP2">&#167;2. Categories</a></li><li><a href="#SP9">&#167;9. Rendering</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Indexing notations. </b>These allow markup such as <code class="display"><span class="extract">this is ^{nifty}</span></code> to mark headwords in the source
documentation for indexing.
</p>
<p class="inwebparagraph">Only two of the four ways to add indexing notation actually create a new
notation as such: the other two instead piggyback on built-in, i.e., already
defined, ones. But in all four cases a new "category" is made, corresponding
roughly to a CSS class used in the final output.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::add_indexing_notation</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">style</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">options</span><span class="plain">) {</span>
<span class="functiontext">CSS::add_span_notation</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">style</span><span class="plain">, </span><span class="constant">INDEX_TEXT_SPP</span><span class="plain">);</span>
<span class="functiontext">Indexes::add_category</span><span class="plain">(</span><span class="identifier">style</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::add_indexing_notation_for_symbols</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">style</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">options</span><span class="plain">) {</span>
<span class="functiontext">CSS::add_span_notation</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">style</span><span class="plain">, </span><span class="constant">INDEX_SYMBOLS_SPP</span><span class="plain">);</span>
<span class="functiontext">Indexes::add_category</span><span class="plain">(</span><span class="identifier">style</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::add_indexing_notation_for_definitions</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">style</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">options</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">subdef</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="string">"!%S"</span><span class="plain">, </span><span class="identifier">subdef</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">subdef</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="string">"-"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="string">"definition"</span><span class="plain">);</span>
<span class="functiontext">Indexes::add_category</span><span class="plain">(</span><span class="identifier">style</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::add_indexing_notation_for_examples</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">style</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">options</span><span class="plain">) {</span>
<span class="functiontext">Indexes::add_category</span><span class="plain">(</span><span class="identifier">style</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!example"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::add_indexing_notation is used in 1/ins (<a href="1-ins.html#SP5_1_4">&#167;5.1.4</a>).</p>
<p class="endnote">The function Indexes::add_indexing_notation_for_symbols is used in 1/ins (<a href="1-ins.html#SP5_1_4">&#167;5.1.4</a>).</p>
<p class="endnote">The function Indexes::add_indexing_notation_for_definitions is used in 1/ins (<a href="1-ins.html#SP5_1_4">&#167;5.1.4</a>).</p>
<p class="endnote">The function Indexes::add_indexing_notation_for_examples is used in 1/ins (<a href="1-ins.html#SP5_1_4">&#167;5.1.4</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Categories. </b>Categories can be looked up by name (which correspond to CSS class name),
and turn out to have a lot of fiddly options added.
</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">indexing_category</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cat_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cat_glossed</span><span class="plain">; </span> <span class="comment">if set, print the style as a gloss</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat_inverted</span><span class="plain">; </span> <span class="comment">if set, apply name inversion</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cat_prefix</span><span class="plain">; </span> <span class="comment">if set, prefix to entries</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cat_suffix</span><span class="plain">; </span> <span class="comment">if set, suffix to entries</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat_bracketed</span><span class="plain">; </span> <span class="comment">if set, apply style to bracketed matter</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat_unbracketed</span><span class="plain">; </span> <span class="comment">if set, also prune brackets</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat_usage</span><span class="plain">; </span> <span class="comment">for counting headwords</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cat_under</span><span class="plain">; </span> <span class="comment">for automatic subentries</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat_alsounder</span><span class="plain">; </span> <span class="comment">for automatic subentries</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">indexing_category</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">categories_by_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">categories_redirect</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">for the built-in categories only</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure indexing_category is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Every new style goes into the name dictionary:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::add_category</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">options</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">redirect</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">redirect</span><span class="plain">) </span>&lt;<span class="cwebmacro">This is a redirection</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">indexing_category</span><span class="plain"> *</span><span class="identifier">ic</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">indexing_category</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">categories_by_name</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">categories_by_name</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(25, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::create</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out the fiddly details</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::add_category is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>When we want to say "use my new category X instead of the built-in category
Y", we use the redirection dictionary. Here <code class="display"><span class="extract">redirect</span></code> is Y, and <code class="display"><span class="extract">name</span></code> is X.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">This is a redirection</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">categories_redirect</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">categories_redirect</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(10, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">categories_redirect</span><span class="plain">, </span><span class="identifier">redirect</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>There's a whole little mini-language for how to express details of our
category:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out the fiddly details</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_glossed</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(\</span><span class="plain">"</span><span class="string">(%c*?)\</span><span class="plain">"</span><span class="string">%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_glossed</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_prefix</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(prefix \</span><span class="plain">"</span><span class="string">(%c*?)\</span><span class="plain">"</span><span class="string">%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_prefix</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_suffix</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(suffix \</span><span class="plain">"</span><span class="string">(%c*?)\</span><span class="plain">"</span><span class="string">%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_suffix</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_under</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(under {(%c*?)}%) *(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_under</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_alsounder</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(also under {(%c*?)}%) *(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_under</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_alsounder</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_inverted</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(invert%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_inverted</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_bracketed</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(bracketed%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_bracketed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_unbracketed</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *%(unbracketed%) *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_bracketed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_unbracketed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">options</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</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">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*?%C%c*"</span><span class="plain">))</span>
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"Unknown notation options: %S"</span><span class="plain">, </span><span class="identifier">options</span><span class="plain">);</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_usage</span><span class="plain"> = 0;</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following looks slow, but in fact there's no problem in practice.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ito_registered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">used for the smoke test of the index</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::scan_indexingnotations</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">outer_mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">outer_mr</span><span class="plain">, </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">text_stream</span><span class="plain"> *</span><span class="identifier">left</span><span class="plain"> = </span><span class="identifier">outer_mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">carets</span><span class="plain"> = </span><span class="identifier">outer_mr</span><span class="element">.exp</span><span class="plain">[1];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">term_to_index</span><span class="plain"> = </span><span class="identifier">outer_mr</span><span class="element">.exp</span><span class="plain">[2];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">right</span><span class="plain"> = </span><span class="identifier">outer_mr</span><span class="element">.exp</span><span class="plain">[3];</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">alphabetise_as</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">term_to_index</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?) *&lt;-- *(%c+) *"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term_to_index</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]); </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">mr</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">term_to_index</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?) *--&gt; *(%c+) *"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term_to_index</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]); </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">alphabetise_as</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">);</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">term_to_index</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*: "</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_ATSTART</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"=___=%C+"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain"> &gt; 0) &amp;&amp; (</span><span class="identifier">E</span><span class="plain">)) {</span>
<span class="identifier">V</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="identifier">E</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">carets</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"^^^"</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">V</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="identifier">E</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">alphabetise_as</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Indexes::note_index_term_alphabetisation</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">alphabetise_as</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, 1);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+) *&lt;-- *(%c+?) *"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">);</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="string">" &lt;-- "</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="identifier">seethis</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, 2);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">);</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="string">" &lt;-- "</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="identifier">seethis</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, 3);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">seethis</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">carets</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"^"</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;test_index_mode</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ito_registered</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="identifier">ito_registered</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">CSS::add_span_notation</span><span class="plain">(</span>
<span class="identifier">I</span><span class="string">"___index_test_on___"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"___index_test_off___"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"smoketest"</span><span class="plain">, </span><span class="constant">MARKUP_SPP</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"=___=standard"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">smoke_test_text</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="string">" %(%0%)"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">smoke_test_text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">":"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">": "</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">midriff</span><span class="plain">, </span><span class="string">"___index_test_on___%S___index_test_off___"</span><span class="plain">, </span><span class="identifier">smoke_test_text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="string">"%S%S%S"</span><span class="plain">, </span><span class="identifier">left</span><span class="plain">, </span><span class="identifier">midriff</span><span class="plain">, </span><span class="identifier">right</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">outer_mr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+?) *: *(%c+) *"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">head</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tail</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1];</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">head</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">);</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">tail</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">claimed</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">span_notation</span><span class="plain"> *</span><span class="identifier">SN</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">SN</span><span class="plain">, </span><span class="reserved">span_notation</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_purpose</span><span class="plain"> == </span><span class="constant">INDEX_TEXT_SPP</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">, </span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_left</span><span class="plain">))</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ends_with_wide_string</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">, </span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_right</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">j</span><span class="plain">=</span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_left_len</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">=</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">L</span><span class="plain">-</span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_right_len</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"=___=%S"</span><span class="plain">, </span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_style</span><span class="plain">);</span>
<span class="identifier">claimed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">trimmed</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">claimed</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S=___=standard"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">); </span> <span class="comment">last resort</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::scan_indexingnotations is used in 2/rr (<a href="2-rr.html#SP4_2">&#167;4.2</a>).</p>
<p class="endnote">The function Indexes::extract_from_indexable_matter is used in <a href="#SP8_3_3">&#167;8.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::index_notify_of_symbol</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">span_notation</span><span class="plain"> *</span><span class="identifier">SN</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">SN</span><span class="plain">, </span><span class="reserved">span_notation</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_purpose</span><span class="plain"> == </span><span class="constant">INDEX_SYMBOLS_SPP</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">symbol</span><span class="plain">, </span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_left</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;unlabelled_title</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">term</span><span class="plain">)</span>
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="functiontext">Characters::tolower</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="string">"=___=%S"</span><span class="plain">, </span><span class="identifier">SN</span><span class="plain">-</span><span class="element">&gt;sp_style</span><span class="plain">);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">V</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="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::index_notify_of_symbol is used in 2/utc (<a href="2-utc.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">given_term</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">anchor</span><span class="plain">, </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">see</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">alphabetise_as</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">given_term</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, 4);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"IGNORE=___=ME%c*"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*:IGNORE=___=ME%c*"</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">alphabetise_as</span><span class="plain">) &gt; 0)</span>
<span class="functiontext">IndexUtilities::alphabetisation_exception</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">alphabetise_as</span><span class="plain">);</span>
<span class="functiontext">Indexes::ensure_lemmas_exist</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*=___=([^_]+?)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">category</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="reserved">indexing_category</span><span class="plain"> *</span><span class="identifier">ic</span><span class="plain"> = (</span><span class="reserved">indexing_category</span><span class="plain"> *)</span>
<span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_alsounder</span><span class="plain"> == </span><span class="constant">TRUE</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">given_term</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, 5);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"IGNORE=___=ME%c*"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*:IGNORE=___=ME%c*"</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="functiontext">Indexes::ensure_lemmas_exist</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">);</span>
<span class="functiontext">Indexes::set_index_point</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Indexes::set_index_point</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::mark_index_term is used in <a href="#SP4">&#167;4</a>, <a href="#SP5">&#167;5</a>, 2/rnd (<a href="2-rnd.html#SP9_1_2">&#167;9.1.2</a>), 2/haj (<a href="2-haj.html#SP21_2">&#167;21.2</a>, <a href="2-haj.html#SP21_5">&#167;21.5</a>, <a href="2-haj.html#SP21_6">&#167;21.6</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></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">index_lemma</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">term</span><span class="plain">; </span> <span class="comment">text of lemma</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">index_points</span><span class="plain">; </span> <span class="comment">comma-separated list of refs</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">index_see</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">&lt;--</span></code>-separated list of refs</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sorting_key</span><span class="plain">; </span> <span class="comment">final reading order is alphabetic on this</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">index_lemma</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">index_points_dict</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::ensure_lemmas_exist</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+) *: *(%c+?) *"</span><span class="plain">)) {</span>
<span class="functiontext">Indexes::ensure_lemmas_exist</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">text</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">copied</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">copied</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="functiontext">Indexes::set_index_point</span><span class="plain">(</span><span class="identifier">copied</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">copied</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::set_index_point</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">term</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">anchor</span><span class="plain">, </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">see</span><span class="plain">) {</span>
<span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">il</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">Dictionaries::find</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">)) {</span>
<span class="identifier">il</span><span class="plain"> = (</span><span class="reserved">index_lemma</span><span class="plain"> *) </span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">term</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">index_points_dict</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">index_points_dict</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(100, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::create</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">);</span>
<span class="identifier">il</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain">);</span>
<span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;term</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_points</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_see</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;sorting_key</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="functiontext">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">section_number</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) </span><span class="identifier">section_number</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;number_within_volume</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">) </span><span class="identifier">section_number</span><span class="plain"> = 100000 + </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">section_number</span><span class="plain"> &gt;= 0)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_points</span><span class="plain">, </span><span class="string">"%d_%d_%S,"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">, </span><span class="identifier">section_number</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_see</span><span class="plain">, </span><span class="string">"%S&lt;--"</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c+ *: *(%c+?) *"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"=___=%C*"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::ensure_lemmas_exist is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The function Indexes::set_index_point is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The structure index_lemma is private to this section.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::note_index_term_alphabetisation</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">term</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">alphabetise_as</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, 6);</span>
<span class="functiontext">IndexUtilities::alphabetisation_exception</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">, </span><span class="identifier">alphabetise_as</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">processed_term</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_under</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Break the text down into a colon-separated list of categories and process each</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*)=___=(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">lemma</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">category</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1];</span>
&lt;<span class="cwebmacro">Redirect category names starting with an exclamation</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Amend the lemma or category as necessary</span> <span class="cwebmacronumber">8.3</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S=___=%S"</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"bad indexing term: %S"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"IGNORE=___=ME"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::note_index_term_alphabetisation is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Indexes::process_category_options is used in <a href="#SP4">&#167;4</a>, <a href="#SP6">&#167;6</a>, <a href="#SP8_1">&#167;8.1</a>, <a href="#SP8_3_3">&#167;8.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Break the text down into a colon-separated list of categories and process each</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+?) *: *(%c+)"</span><span class="plain">)) {</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="constant">TRUE</span><span class="plain">, 7);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">allow_under</span><span class="plain">, 8);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b>A category beginning <code class="display"><span class="extract">!</span></code> is either redirected to a regular category, or
else suppressed as unwanted (because the user didn't set up a redirection).
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Redirect category names starting with an exclamation</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">) == </span><span class="character">'!'</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">redirected</span><span class="plain"> =</span>
<span class="functiontext">Dictionaries::get_text</span><span class="plain">(</span><span class="identifier">categories_redirect</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">redirected</span><span class="plain">) &gt; 0) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">redirected</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"IGNORE=___=ME"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3"></a><b>&#167;8.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Amend the lemma or category as necessary</span> <span class="cwebmacronumber">8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">indexing_category</span><span class="plain"> *</span><span class="identifier">ic</span><span class="plain"> = (</span><span class="reserved">indexing_category</span><span class="plain"> *)</span>
<span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Perform name inversion as necessary</span> <span class="cwebmacronumber">8.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Prefix and suffix as necessary</span> <span class="cwebmacronumber">8.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Automatically file under a headword as necessary</span> <span class="cwebmacronumber">8.3.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3_1"></a><b>&#167;8.3.1. </b>This inverts "Sir Robert Cecil" to "Cecil, Sir Robert", but leaves
"Mary, Queen of Scots" alone.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Perform name inversion as necessary</span> <span class="cwebmacronumber">8.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_inverted</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*,%c*"</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) (%C+) *"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="string">"%S, %S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8_3">&#167;8.3</a>.</p>
<p class="inwebparagraph"><a id="SP8_3_2"></a><b>&#167;8.3.2. </b>This, for example, could append "(monarch)" to the name of every lemma
in the category "royalty", so that "James I" becomes "James I (monarch)".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Prefix and suffix as necessary</span> <span class="cwebmacronumber">8.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rewritten</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">rewritten</span><span class="plain">, </span><span class="string">"%S%S%S"</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_prefix</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_suffix</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="identifier">rewritten</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rewritten</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8_3">&#167;8.3</a>.</p>
<p class="inwebparagraph"><a id="SP8_3_3"></a><b>&#167;8.3.3. </b>And this could automatically reroute the lemma so that it appears as
a subentry under the category's choice of headword: e.g., "James I"
might be placed as as a subentry of "Kings".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Automatically file under a headword as necessary</span> <span class="cwebmacronumber">8.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">allow_under</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_under</span><span class="plain">) &gt; 0)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">extracted</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">icu</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">old_lemma</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">old_lemma</span><span class="plain">, </span><span class="identifier">lemma</span><span class="plain">);</span>
<span class="functiontext">Indexes::extract_from_indexable_matter</span><span class="plain">(</span><span class="identifier">extracted</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_under</span><span class="plain">);</span>
<span class="functiontext">Indexes::process_category_options</span><span class="plain">(</span><span class="identifier">icu</span><span class="plain">, </span><span class="identifier">extracted</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, 9);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lemma</span><span class="plain">, </span><span class="string">"%S:%S"</span><span class="plain">, </span><span class="identifier">icu</span><span class="plain">, </span><span class="identifier">old_lemma</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">extracted</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">old_lemma</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">icu</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8_3">&#167;8.3</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Rendering. </b>Having accumulated the lemmas, it's time to sort them and write the index
as it will be seen by the reader.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Indexes::write_general_index</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">IndexUtilities::open_page</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"General Index"</span><span class="plain">, </span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;definitions_index_leafname</span><span class="plain">);</span>
<span class="reserved">index_lemma</span><span class="plain"> **</span><span class="identifier">lemma_list</span><span class="plain"> =</span>
<span class="functiontext">Memory::I7_calloc</span><span class="plain">(</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain">), </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain"> *), </span><span class="constant">CLS_SORTING_MREASON</span><span class="plain">);</span>
<span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">il</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">, </span><span class="reserved">index_lemma</span><span class="plain">) </span><span class="identifier">lemma_list</span><span class="plain">[</span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">] = </span><span class="identifier">il</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Construct sorting keys for the lemmas</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="identifier">qsort</span><span class="plain">(</span><span class="identifier">lemma_list</span><span class="plain">, (</span><span class="identifier">size_t</span><span class="plain">) </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain">), </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain"> *),</span>
<span class="functiontext">Indexes::sort_comparison</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Render the index in sorted order</span> <span class="cwebmacronumber">9.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Give feedback in index testing mode</span> <span class="cwebmacronumber">9.3</span>&gt;<span class="plain">;</span>
<span class="functiontext">Memory::I7_free</span><span class="plain">(</span><span class="identifier">lemma_list</span><span class="plain">, </span><span class="constant">CLS_SORTING_MREASON</span><span class="plain">,</span>
<span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain">)*((</span><span class="reserved">int</span><span class="plain">) </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain"> *)));</span>
<span class="functiontext">IndexUtilities::close_page</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Indexes::sort_comparison</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
<span class="reserved">const</span><span class="plain"> </span><span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">L1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">index_lemma</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">);</span>
<span class="reserved">const</span><span class="plain"> </span><span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">L2</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">index_lemma</span><span class="plain"> **) </span><span class="identifier">ent2</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">L1</span><span class="plain">-</span><span class="element">&gt;sorting_key</span><span class="plain">, </span><span class="identifier">L2</span><span class="plain">-</span><span class="element">&gt;sorting_key</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Indexes::write_general_index is used in 1/mn (<a href="1-mn.html#SP1_5">&#167;1.5</a>).</p>
<p class="endnote">The function Indexes::sort_comparison appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct sorting keys for the lemmas</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">il</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">, </span><span class="reserved">index_lemma</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;term</span><span class="plain">);</span>
<span class="comment">ensure subentries follow main entries</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">L</span><span class="string">": *"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ZZZZZZZZZZZZZZZZZZZZZZ"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">IndexUtilities::improve_alphabetisation</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"a/%C+ (%c*)"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"the/%C+ (%c*)"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;index_alphabetisation_algorithm</span><span class="plain"> == </span><span class="constant">WORD_ALPHABETIZATION</span><span class="plain">)</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" "</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"aaaaaaaaaaaaaaaaaaaaaa"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">, </span><span class="identifier">sort_key</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(%c*?%)"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" "</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">, </span><span class="identifier">L</span><span class="string">","</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="character">' '</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Characters::isalpha</span><span class="plain">(</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">)))</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;sorting_key</span><span class="plain">, </span><span class="string">"%c_%S=___=%S=___=%07d"</span><span class="plain">,</span>
<span class="identifier">f</span><span class="plain">, </span><span class="identifier">un</span><span class="plain">, </span><span class="identifier">sort_key</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">un</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">sort_key</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_2"></a><b>&#167;9.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render the index in sorted order</span> <span class="cwebmacronumber">9.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">IndexUtilities::alphabet_row</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"table"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">indextable\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_incipit</span><span class="plain"> = 0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">index_lemma</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">il</span><span class="plain"> = </span><span class="identifier">lemma_list</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">incipit</span><span class="plain"> = </span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;sorting_key</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Characters::isalpha</span><span class="plain">(</span><span class="identifier">incipit</span><span class="plain">)) </span><span class="identifier">incipit</span><span class="plain"> = </span><span class="functiontext">Characters::toupper</span><span class="plain">(</span><span class="identifier">incipit</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">incipit</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">incipit</span><span class="plain"> != </span><span class="identifier">current_incipit</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_incipit</span><span class="plain"> != 0) </span>&lt;<span class="cwebmacro">End a block of the index</span> <span class="cwebmacronumber">9.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">current_incipit</span><span class="plain"> = </span><span class="identifier">incipit</span><span class="plain">;</span>
<span class="functiontext">IndexUtilities::note_letter</span><span class="plain">(</span><span class="identifier">current_incipit</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Start a block of the index</span> <span class="cwebmacronumber">9.2.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Render an index entry</span> <span class="cwebmacronumber">9.2.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_incipit</span><span class="plain"> != 0) </span>&lt;<span class="cwebmacro">End a block of the index</span> <span class="cwebmacronumber">9.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"table"</span><span class="plain">);</span>
<span class="functiontext">IndexUtilities::alphabet_row</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_1"></a><b>&#167;9.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Start a block of the index</span> <span class="cwebmacronumber">9.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"tr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">letterblock\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">inc</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_incipit</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">inc</span><span class="plain">, </span><span class="string">"NN"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">inc</span><span class="plain">, </span><span class="identifier">current_incipit</span><span class="plain">);</span>
<span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">inc</span><span class="plain">);</span>
<span class="functiontext">IndexUtilities::majuscule_heading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">inc</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">inc</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2">&#167;9.2</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_2"></a><b>&#167;9.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">End a block of the index</span> <span class="cwebmacronumber">9.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"tr"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2">&#167;9.2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP9_2_3"></a><b>&#167;9.2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render an index entry</span> <span class="cwebmacronumber">9.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">anc</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">anc</span><span class="plain">, </span><span class="string">"l%d"</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">anc</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">anc</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;term</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*)=___=(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="reserved">indexing_category</span><span class="plain"> *</span><span class="identifier">ic</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">Dictionaries::find</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Warning: no such indexing category as '%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">ic</span><span class="plain"> = </span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">categories_by_name</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_usage</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">indent_level</span><span class="plain"> = 0;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out the wording and indentation level</span> <span class="cwebmacronumber">9.2.3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">indexentry\</span><span class="plain">"</span><span class="string"> style=\</span><span class="plain">"</span><span class="string">margin-left: %dem;\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, 4*</span><span class="identifier">indent_level</span><span class="plain">);</span>
<span class="functiontext">HTML::open</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"p"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Render the lemma text</span> <span class="cwebmacronumber">9.2.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Render the category gloss</span> <span class="cwebmacronumber">9.2.3.3</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&amp;nbsp;"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = 0;</span>
&lt;<span class="cwebmacro">Render the list of index points</span> <span class="cwebmacronumber">9.2.3.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Render the list of see-references</span> <span class="cwebmacronumber">9.2.3.5</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2">&#167;9.2</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_3_1"></a><b>&#167;9.2.3.1. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">SAVED_OPEN_BRACKET</span><span class="plain"> 0</span><span class="identifier">x0086</span><span class="plain"> </span> <span class="comment">Unicode "start of selected area"</span>
<span class="definitionkeyword">define</span> <span class="constant">SAVED_CLOSE_BRACKET</span><span class="plain"> 0</span><span class="identifier">x0087</span><span class="plain"> </span> <span class="comment">Unicode "end of selected area"</span>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out the wording and indentation level</span> <span class="cwebmacronumber">9.2.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">, </span><span class="identifier">term</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">untreated</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*?: *(%c+)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]); </span><span class="identifier">indent_level</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">Rawtext::escape_HTML_characters_in</span><span class="plain">(</span><span class="identifier">untreated</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">L</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0, </span><span class="identifier">d</span><span class="plain"> = 0, </span><span class="identifier">id</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Characters::isdigit</span><span class="plain">(</span><span class="identifier">id</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1))) {</span>
<span class="identifier">i</span><span class="plain">++, </span><span class="identifier">d</span><span class="plain">++; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">*10 + (</span><span class="identifier">id</span><span class="plain"> - </span><span class="character">'0'</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == 0) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">untreated</span><span class="plain">, ++</span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == </span><span class="character">'('</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">SAVED_OPEN_BRACKET</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == </span><span class="character">')'</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">SAVED_CLOSE_BRACKET</span><span class="plain">;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_bracketed</span><span class="plain">) {</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)%((%c*?)%)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">,</span>
<span class="string">"%S&lt;span class=\</span><span class="plain">"</span><span class="string">index%Sbracketed\</span><span class="plain">"</span><span class="string">&gt;___openb___%S___closeb___&lt;/span&gt;%S"</span><span class="plain">,</span>
<span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_unbracketed</span><span class="plain">) {</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"___openb___"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"___closeb___"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"___openb___"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"("</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">lemma_wording</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"___closeb___"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">")"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="plain">}</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">lemma_wording</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> == </span><span class="constant">SAVED_OPEN_BRACKET</span><span class="plain">) </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</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">d</span><span class="plain"> == </span><span class="constant">SAVED_CLOSE_BRACKET</span><span class="plain">) </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="character">')'</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2_3">&#167;9.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_3_2"></a><b>&#167;9.2.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render the lemma text</span> <span class="cwebmacronumber">9.2.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;span class=\</span><span class="plain">"</span><span class="string">index%S\</span><span class="plain">"</span><span class="string">&gt;"</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">lemma_wording</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2_3">&#167;9.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_3_3"></a><b>&#167;9.2.3.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render the category gloss</span> <span class="cwebmacronumber">9.2.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_glossed</span><span class="plain">) &gt; 0)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;span class=\</span><span class="plain">"</span><span class="string">indexgloss\</span><span class="plain">"</span><span class="string">&gt;%S&lt;/span&gt;"</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_glossed</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2_3">&#167;9.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_3_4"></a><b>&#167;9.2.3.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render the list of index points</span> <span class="cwebmacronumber">9.2.3.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">elist</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">elist</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_points</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">elist</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">lc</span><span class="plain">++ &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">volume_number</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">section_number</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], 0);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">elist</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[3]);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">etext</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">section_number</span><span class="plain"> &gt;= 100000) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">eno</span><span class="plain"> = </span><span class="identifier">section_number</span><span class="plain">-100000;</span>
<span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">examples</span><span class="plain">[</span><span class="identifier">eno</span><span class="plain">];</span>
<span class="identifier">section_number</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;example_belongs_to_section</span><span class="plain">[</span><span class="identifier">volume_number</span><span class="plain">]-</span><span class="element">&gt;number_within_volume</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">etext</span><span class="plain">, </span><span class="string">" ex %d"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;example_position</span><span class="plain">[0]);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">, </span><span class="string">"e%d"</span><span class="plain">, </span><span class="identifier">eno</span><span class="plain">);</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">volumes</span><span class="plain">[</span><span class="identifier">volume_number</span><span class="plain">]-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">section_number</span><span class="plain">];</span>
<span class="reserved">if</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="identifier">PRINT</span><span class="plain">(</span><span class="string">"Vol %d has no section no %d (goes to %d)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">volume_number</span><span class="plain">, </span><span class="identifier">section_number</span><span class="plain">, </span><span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">volume_number</span><span class="plain">]-</span><span class="element">&gt;vol_section_count</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown section"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_filename</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="string">"#%S"</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">link_class</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"indexlink"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">volume_number</span><span class="plain"> &gt; 0) </span><span class="identifier">link_class</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"indexlinkalt"</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;label</span><span class="plain">, </span><span class="identifier">etext</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::general_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">link_class</span><span class="plain">, </span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">link</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">etext</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">elist</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2_3">&#167;9.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP9_2_3_5"></a><b>&#167;9.2.3.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Render the list of see-references</span> <span class="cwebmacronumber">9.2.3.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">seelist</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">seelist</span><span class="plain">, </span><span class="identifier">il</span><span class="plain">-</span><span class="element">&gt;index_see</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sc</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">seelist</span><span class="plain">) &gt; 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lc</span><span class="plain"> &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">indexsee\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"see"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lc</span><span class="plain"> &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" also"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/span&gt; "</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">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">seelist</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *&lt;-- *(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">++ &gt; 0) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">); }</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">see</span><span class="plain"> = </span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">seelist</span><span class="plain">, </span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="reserved">index_lemma</span><span class="plain"> *</span><span class="identifier">ils</span><span class="plain"> = (</span><span class="reserved">index_lemma</span><span class="plain"> *) </span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">index_points_dict</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="string">"#l%d"</span><span class="plain">, </span><span class="identifier">ils</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"=___=%i+?:"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">":"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"=___=%i+"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">see</span><span class="plain">, </span><span class="identifier">L</span><span class="string">":"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">": "</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::general_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"indexseelink"</span><span class="plain">, </span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">see</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_2_3">&#167;9.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP9_3"></a><b>&#167;9.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Give feedback in index testing mode</span> <span class="cwebmacronumber">9.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;test_index_mode</span><span class="plain">) {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"indoc ran in index test mode: do not publish typeset documentation.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = 0;</span>
<span class="reserved">indexing_category</span><span class="plain"> *</span><span class="identifier">ic</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ic</span><span class="plain">, </span><span class="reserved">indexing_category</span><span class="plain">) {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"%S: %d headword(s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_name</span><span class="plain">, </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_usage</span><span class="plain">);</span>
<span class="identifier">t</span><span class="plain"> += </span><span class="identifier">ic</span><span class="plain">-</span><span class="element">&gt;cat_usage</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"%d headword(s) in all\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-iu.html">Back to 'Indexing Utilities'</a></li><li><a href="3-ei.html">Continue with 'Examples Index'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>