mirror of
https://github.com/ganelson/inform.git
synced 2024-07-17 06:24:24 +03:00
654 lines
99 KiB
HTML
654 lines
99 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Wordings</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="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="index.html"><span class="selectedlink">words</span></a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Wordings' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">words</a></li><li><a href="index.html#3">Chapter 3: Words in Sequence</a></li><li><b>Wordings</b></li></ul><p class="purpose">To manage contiguous word ranges.</p>
|
|
|
|
<ul class="toc"><li><a href="3-wrd.html#SP1">§1. Definitions</a></li><li><a href="3-wrd.html#SP6">§6. Construction</a></li><li><a href="3-wrd.html#SP8">§8. Reading</a></li><li><a href="3-wrd.html#SP9">§9. Manipulation</a></li><li><a href="3-wrd.html#SP10">§10. Widening</a></li><li><a href="3-wrd.html#SP11">§11. Position</a></li><li><a href="3-wrd.html#SP12">§12. Emptiness</a></li><li><a href="3-wrd.html#SP13">§13. Comparing wordings</a></li><li><a href="3-wrd.html#SP18">§18. Bracketing</a></li><li><a href="3-wrd.html#SP21">§21. Searching for unusual spacing in ranges</a></li><li><a href="3-wrd.html#SP22">§22. The Writer</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Wordings are an efficient representation of a multi-word name for
|
|
something, using the fact that almost all names derive from contiguous
|
|
runs of words in the source text.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Recall that words are numbered from 0 upwards in order of reading into
|
|
the lexer. The wording <code class="display"><span class="extract">Wordings::new(A, B)</span></code> represents both a positional
|
|
marker, at word number <code class="display"><span class="extract">A</span></code>, and also some textual content, the text making
|
|
up words <code class="display"><span class="extract">A</span></code> to <code class="display"><span class="extract">B</span></code> inclusive. Different wordings can represent the
|
|
same text at different positions in the source text, for example if
|
|
"brown spotted owl" occurs multiple times.
|
|
</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">wording</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">word_A</span><span class="plain">, </span><span class="identifier">word_B</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">wording</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure wording is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Note that this applies even to the empty text. A wording holds no text
|
|
if both <code class="display"><span class="extract">A</span></code> and <code class="display"><span class="extract">B</span></code> are negative, or if <code class="display"><span class="extract">A</span></code> is larger than <code class="display"><span class="extract">B</span></code>. Thus
|
|
the wording <code class="display"><span class="extract">(17, 16)</span></code> represents the empty text at position 17. (Preform
|
|
makes use of this when parsing nonterminals which match conditionally
|
|
but consume no text, for example.) When we are representing no text and
|
|
no position either, we should use the following constant wording:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">EMPTY_WORDING</span><span class="plain"> ((</span><span class="reserved">wording</span><span class="plain">) { -1, -1 })</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Annoyingly, <code class="display"><span class="extract">gcc</span></code> (though not <code class="display"><span class="extract">clang</span></code>) rejects this as an initializer, so
|
|
we also need:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">EMPTY_WORDING_INIT</span><span class="plain"> { -1, -1 }</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>We will frequently want to loop through the words in a wording, so
|
|
the following macro is convenient. Note that the loop body is not executed
|
|
if the wording is empty.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Construction. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::new<button class="popup" onclick="togglePopup('usagePopup78')">...<span class="popuptext" id="usagePopup78">Usage of <b>Wordings::new</b>:<br><a href="3-wrd.html#SP10">§10</a>, Lexer - <a href="3-lxr.html#SP24">§24</a>, <a href="3-lxr.html#SP24_3">§24.3</a>, <a href="3-lxr.html#SP28">§28</a><br>Feeds - <a href="3-fds.html#SP3">§3</a><br>Preform - <a href="4-prf.html#SP26_3">§26.3</a>, <a href="4-prf.html#SP50_2_1_2">§50.2.1.2</a>, <a href="4-prf.html#SP50_2_1_2_3_3_5">§50.2.1.2.3.3.5</a>, <a href="4-prf.html#SP50_2_1_2_3_3_3_1">§50.2.1.2.3.3.3.1</a>, <a href="4-prf.html#SP51">§51</a></span></button></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="reserved">int</span><span class="plain"> </span><span class="identifier">B</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">wording</span><span class="plain">) { </span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain"> };</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::one_word<button class="popup" onclick="togglePopup('usagePopup79')">...<span class="popuptext" id="usagePopup79">Usage of <b>Wordings::one_word</b>:<br>Preform - <a href="4-prf.html#SP26">§26</a>, <a href="4-prf.html#SP26_1">§26.1</a>, <a href="4-prf.html#SP29">§29</a>, <a href="4-prf.html#SP50_2_1_2_3_3">§50.2.1.2.3.3</a></span></button></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="reserved">return</span><span class="plain"> (</span><span class="reserved">wording</span><span class="plain">) { </span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">A</span><span class="plain"> };</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Note that these two are sometimes used to construct empty wordings either
|
|
by moving <code class="display"><span class="extract">A</span></code> past <code class="display"><span class="extract">B</span></code>, or moving <code class="display"><span class="extract">B</span></code> before <code class="display"><span class="extract">A</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::up_to<button class="popup" onclick="togglePopup('usagePopup80')">...<span class="popuptext" id="usagePopup80">Usage of <b>Wordings::up_to</b>:<br>Preform - <a href="4-prf.html#SP50_2_1_2_3_3">§50.2.1.2.3.3</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_wn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> = </span><span class="identifier">last_wn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::from<button class="popup" onclick="togglePopup('usagePopup81')">...<span class="popuptext" id="usagePopup81">Usage of <b>Wordings::from</b>:<br>Word Assemblages - <a href="2-wa.html#SP11">§11</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">first_wn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> = </span><span class="identifier">first_wn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Reading. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::length<button class="popup" onclick="togglePopup('usagePopup82')">...<span class="popuptext" id="usagePopup82">Usage of <b>Wordings::length</b>:<br><a href="3-wrd.html#SP9">§9</a>, <a href="3-wrd.html#SP14">§14</a>, <a href="3-wrd.html#SP21">§21</a>, Word Assemblages - <a href="2-wa.html#SP4">§4</a>, <a href="2-wa.html#SP10">§10</a>, <a href="2-wa.html#SP11">§11</a><br>Lexer - <a href="3-lxr.html#SP28">§28</a><br>Preform - <a href="4-prf.html#SP29_2">§29.2</a>, <a href="4-prf.html#SP35">§35</a>, <a href="4-prf.html#SP50">§50</a>, <a href="4-prf.html#SP50_2_1">§50.2.1</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> - </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::phrasual_length<button class="popup" onclick="togglePopup('usagePopup83')">...<span class="popuptext" id="usagePopup83">Usage of <b>Wordings::phrasual_length</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::first_wn<button class="popup" onclick="togglePopup('usagePopup84')">...<span class="popuptext" id="usagePopup84">Usage of <b>Wordings::first_wn</b>:<br><a href="3-wrd.html#SP18">§18</a>, <a href="3-wrd.html#SP21">§21</a>, <a href="3-wrd.html#SP22_3">§22.3</a>, <a href="3-wrd.html#SP22_4">§22.4</a>, Vocabulary - <a href="2-vcb.html#SP17">§17</a><br>Word Assemblages - <a href="2-wa.html#SP9">§9</a>, <a href="2-wa.html#SP10">§10</a>, <a href="2-wa.html#SP11">§11</a><br>Lexer - <a href="3-lxr.html#SP24">§24</a>, <a href="3-lxr.html#SP28">§28</a><br>Preform - <a href="4-prf.html#SP21">§21</a>, <a href="4-prf.html#SP26">§26</a>, <a href="4-prf.html#SP29_2">§29.2</a>, <a href="4-prf.html#SP34">§34</a>, <a href="4-prf.html#SP35">§35</a>, <a href="4-prf.html#SP50_2">§50.2</a>, <a href="4-prf.html#SP50_2_1_2_2">§50.2.1.2.2</a>, <a href="4-prf.html#SP50_2_1_2_3_1">§50.2.1.2.3.1</a>, <a href="4-prf.html#SP50_2_1_2_3_3">§50.2.1.2.3.3</a>, <a href="4-prf.html#SP50_2_1_2_3_3_3_1">§50.2.1.2.3.3.3.1</a><br>Basic Nonterminals - <a href="4-bn.html#SP1">§1</a>, <a href="4-bn.html#SP2">§2</a>, <a href="4-bn.html#SP5">§5</a>, <a href="4-bn.html#SP6">§6</a>, <a href="4-bn.html#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::last_wn<button class="popup" onclick="togglePopup('usagePopup85')">...<span class="popuptext" id="usagePopup85">Usage of <b>Wordings::last_wn</b>:<br><a href="3-wrd.html#SP18">§18</a>, <a href="3-wrd.html#SP21">§21</a>, <a href="3-wrd.html#SP22_1">§22.1</a>, <a href="3-wrd.html#SP22_2">§22.2</a>, Word Assemblages - <a href="2-wa.html#SP11">§11</a><br>Text From Files - <a href="3-tff.html#SP5">§5</a><br>Preform - <a href="4-prf.html#SP26">§26</a>, <a href="4-prf.html#SP26_3">§26.3</a>, <a href="4-prf.html#SP28_1_1">§28.1.1</a>, <a href="4-prf.html#SP28_1_3">§28.1.3</a>, <a href="4-prf.html#SP50_2_1_2_2">§50.2.1.2.2</a>, <a href="4-prf.html#SP50_2_1_2_3_3">§50.2.1.2.3.3</a>, <a href="4-prf.html#SP50_2_1_2_3_3_3">§50.2.1.2.3.3.3</a>, <a href="4-prf.html#SP50_2_1_2_3_3_5">§50.2.1.2.3.3.5</a>, <a href="4-prf.html#SP50_2_1_2_3_3_3_1">§50.2.1.2.3.3.3.1</a>, <a href="4-prf.html#SP51">§51</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Manipulation. </b>Unlike the construction routines above, these never make positional empty
|
|
wordings.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::truncate<button class="popup" onclick="togglePopup('usagePopup86')">...<span class="popuptext" id="usagePopup86">Usage of <b>Wordings::truncate</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::length</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) > </span><span class="identifier">max</span><span class="plain">) </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> + </span><span class="identifier">max</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::first_word<button class="popup" onclick="togglePopup('usagePopup87')">...<span class="popuptext" id="usagePopup87">Usage of <b>Wordings::first_word</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::last_word<button class="popup" onclick="togglePopup('usagePopup88')">...<span class="popuptext" id="usagePopup88">Usage of <b>Wordings::last_word</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::trim_first_word<button class="popup" onclick="togglePopup('usagePopup89')">...<span class="popuptext" id="usagePopup89">Usage of <b>Wordings::trim_first_word</b>:<br>Preform - <a href="4-prf.html#SP29_2">§29.2</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> > </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::trim_last_word<button class="popup" onclick="togglePopup('usagePopup90')">...<span class="popuptext" id="usagePopup90">Usage of <b>Wordings::trim_last_word</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> > </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::trim_both_ends<button class="popup" onclick="togglePopup('usagePopup91')">...<span class="popuptext" id="usagePopup91">Usage of <b>Wordings::trim_both_ends</b>:<br><a href="3-wrd.html#SP18">§18</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">++; </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> > </span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Widening. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="functiontext">Wordings::union<button class="popup" onclick="togglePopup('usagePopup92')">...<span class="popuptext" id="usagePopup92">Usage of <b>Wordings::union</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W1</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w1</span><span class="plain"> > </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">) </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">; </span><span class="comment"> the min</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w2</span><span class="plain"> = </span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w2</span><span class="plain"> < </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">) </span><span class="identifier">w2</span><span class="plain"> = </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">; </span><span class="comment"> the max</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-wrd.html#SP6">Wordings::new</a></span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">, </span><span class="identifier">w2</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Position. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::within<button class="popup" onclick="togglePopup('usagePopup93')">...<span class="popuptext" id="usagePopup93">Usage of <b>Wordings::within</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">SMALL</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">BIG</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::nonempty</a></span><span class="plain">(</span><span class="identifier">SMALL</span><span class="plain">)) && (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::nonempty</a></span><span class="plain">(</span><span class="identifier">BIG</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">SMALL</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="identifier">BIG</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">) && (</span><span class="identifier">SMALL</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> <= </span><span class="identifier">BIG</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">source_location</span><span class="plain"> </span><span class="functiontext">Wordings::location<button class="popup" onclick="togglePopup('usagePopup94')">...<span class="popuptext" id="usagePopup94">Usage of <b>Wordings::location</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_location</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Emptiness. </b>See above.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::empty<button class="popup" onclick="togglePopup('usagePopup95')">...<span class="popuptext" id="usagePopup95">Usage of <b>Wordings::empty</b>:<br><a href="3-wrd.html#SP7">§7</a>, <a href="3-wrd.html#SP8">§8</a>, <a href="3-wrd.html#SP9">§9</a>, <a href="3-wrd.html#SP10">§10</a>, <a href="3-wrd.html#SP21">§21</a>, <a href="3-wrd.html#SP22_3">§22.3</a>, Vocabulary - <a href="2-vcb.html#SP17">§17</a><br>Word Assemblages - <a href="2-wa.html#SP4">§4</a>, <a href="2-wa.html#SP10">§10</a><br>Preform - <a href="4-prf.html#SP50_2">§50.2</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> >= </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::nonempty<button class="popup" onclick="togglePopup('usagePopup96')">...<span class="popuptext" id="usagePopup96">Usage of <b>Wordings::nonempty</b>:<br><a href="3-wrd.html#SP11">§11</a>, <a href="3-wrd.html#SP14">§14</a>, Word Assemblages - <a href="2-wa.html#SP11">§11</a><br>Identifiers - <a href="3-idn.html#SP3">§3</a><br>Preform - <a href="4-prf.html#SP17">§17</a>, <a href="4-prf.html#SP29_2">§29.2</a><br>Basic Nonterminals - <a href="4-bn.html#SP6">§6</a>, <a href="4-bn.html#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> >= </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Comparing wordings. </b>First, though it's little needed, literal equality: two wordings are the
|
|
same only if they represent the same word numbers in the source.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::eq<button class="popup" onclick="togglePopup('usagePopup97')">...<span class="popuptext" id="usagePopup97">Usage of <b>Wordings::eq</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> == </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">) && (</span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> == </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>Two wordings are said to "match" if they are nonempty and contain the same text.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The calculation overhead makes it marginally not worth using a hash function
|
|
to speed up the following comparison, which requires two excerpts to be
|
|
absolutely equal.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::match<button class="popup" onclick="togglePopup('usagePopup98')">...<span class="popuptext" id="usagePopup98">Usage of <b>Wordings::match</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP14">Wordings::match_inner</a></span><span class="plain">(</span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">, </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::starts_with<button class="popup" onclick="togglePopup('usagePopup99')">...<span class="popuptext" id="usagePopup99">Usage of <b>Wordings::starts_with</b>:<br>Word Assemblages - <a href="2-wa.html#SP11">§11</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::nonempty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) && (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::nonempty</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::length</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) >= </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::length</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP14">Wordings::match_inner</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> + </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> - </span><span class="identifier">S</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::match_inner<button class="popup" onclick="togglePopup('usagePopup100')">...<span class="popuptext" id="usagePopup100">Usage of <b>Wordings::match_inner</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w3</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w4</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w4</span><span class="plain">-</span><span class="identifier">w3</span><span class="plain"> != </span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">w1</span><span class="plain"><0) || (</span><span class="identifier">w3</span><span class="plain"><0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</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">=0; </span><span class="identifier">j</span><span class="plain"><=</span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">w3</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. </b>Case sensitively:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::match_cs<button class="popup" onclick="togglePopup('usagePopup101')">...<span class="popuptext" id="usagePopup101">Usage of <b>Wordings::match_cs</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP15">Wordings::match_cs_inner</a></span><span class="plain">(</span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">, </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::match_cs_inner<button class="popup" onclick="togglePopup('usagePopup102')">...<span class="popuptext" id="usagePopup102">Usage of <b>Wordings::match_cs_inner</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w3</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w4</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w4</span><span class="plain">-</span><span class="identifier">w3</span><span class="plain"> != </span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">w1</span><span class="plain"><0) || (</span><span class="identifier">w3</span><span class="plain"><0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</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">=0; </span><span class="identifier">j</span><span class="plain"><=</span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_words_cs</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">w3</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>This alternative form is slower, but gets the case where one of the words
|
|
holds double-quoted text correctly. (We don't need this often because quoted
|
|
text is in general not allowed in identifier names.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::match_perhaps_quoted<button class="popup" onclick="togglePopup('usagePopup103')">...<span class="popuptext" id="usagePopup103">Usage of <b>Wordings::match_perhaps_quoted</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W1</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W2</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">W1</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">w2</span><span class="plain"> = </span><span class="identifier">W1</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">, </span><span class="identifier">w3</span><span class="plain"> = </span><span class="identifier">W2</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">w4</span><span class="plain"> = </span><span class="identifier">W2</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w4</span><span class="plain">-</span><span class="identifier">w3</span><span class="plain"> != </span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">w1</span><span class="plain"><0) || (</span><span class="identifier">w3</span><span class="plain"><0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</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">=0; </span><span class="identifier">j</span><span class="plain"><=</span><span class="identifier">w2</span><span class="plain">-</span><span class="identifier">w1</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">w3</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="2-vcb.html#SP11">Vocabulary::test_flags</a></span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, (</span><span class="constant">TEXT_MC</span><span class="plain">+</span><span class="constant">TEXTWITHSUBS_MC</span><span class="plain">))) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="2-vcb.html#SP11">Vocabulary::test_flags</a></span><span class="plain">(</span><span class="identifier">w3</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, (</span><span class="constant">TEXT_MC</span><span class="plain">+</span><span class="constant">TEXTWITHSUBS_MC</span><span class="plain">))) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_raw_text</a></span><span class="plain">(</span><span class="identifier">w1</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">), </span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_raw_text</a></span><span class="plain">(</span><span class="identifier">w3</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">)) == </span><span class="constant">0</span><span class="plain">))</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>And relatedly, used for sorting into alphabetical order, a direct analogue
|
|
of <code class="display"><span class="extract">strcmp</span></code> but for word ranges:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::strcmp<button class="popup" onclick="togglePopup('usagePopup104')">...<span class="popuptext" id="usagePopup104">Usage of <b>Wordings::strcmp</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">Y</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x1</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">.</span><span class="identifier">word_A</span><span class="plain">, </span><span class="identifier">x2</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">, </span><span class="identifier">y1</span><span class="plain"> = </span><span class="identifier">Y</span><span class="plain">.</span><span class="element">word_A</span><span class="plain">, </span><span class="identifier">y2</span><span class="plain"> = </span><span class="identifier">Y</span><span class="plain">.</span><span class="identifier">word_B</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x1</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y1</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> -1; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y1</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</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">int</span><span class="plain"> </span><span class="identifier">l1</span><span class="plain"> = </span><span class="identifier">x2</span><span class="plain"> - </span><span class="identifier">x1</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">l2</span><span class="plain"> = </span><span class="identifier">y2</span><span class="plain"> - </span><span class="identifier">y1</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">for</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="identifier">l1</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain"><</span><span class="identifier">l2</span><span class="plain">); </span><span class="identifier">n</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_text</a></span><span class="plain">(</span><span class="identifier">x1</span><span class="plain"> + </span><span class="identifier">n</span><span class="plain">), </span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_text</a></span><span class="plain">(</span><span class="identifier">y1</span><span class="plain"> + </span><span class="identifier">n</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">l1</span><span class="plain"> - </span><span class="identifier">l2</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Bracketing. </b>We are going to need to look for paired brackets at the outside of an
|
|
excerpt reasonably quickly, and the following routine performs that test.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::paired_brackets<button class="popup" onclick="togglePopup('usagePopup105')">...<span class="popuptext" id="usagePopup105">Usage of <b>Wordings::paired_brackets</b>:<br>Preform - <a href="4-prf.html#SP50_2_1_2">§50.2.1.2</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::last_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP19">Wordings::mismatched_brackets</a></span><span class="plain">(</span><span class="functiontext"><a href="3-wrd.html#SP9">Wordings::trim_both_ends</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b>For problem detection:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::mismatched_brackets<button class="popup" onclick="togglePopup('usagePopup106')">...<span class="popuptext" id="usagePopup106">Usage of <b>Wordings::mismatched_brackets</b>:<br><a href="3-wrd.html#SP18">§18</a></span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b>For syntax disambiguation:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::top_level_comma<button class="popup" onclick="togglePopup('usagePopup107')">...<span class="popuptext" id="usagePopup107">Usage of <b>Wordings::top_level_comma</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) || (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACE_V</span><span class="plain">)) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) && (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">COMMA_V</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Searching for unusual spacing in ranges. </b>Looking forward to see how far the current column or row extends,
|
|
for formatted tables. The idea is that we have a range <code class="display"><span class="extract">w1</span></code> to <code class="display"><span class="extract">w2</span></code>,
|
|
and that the current column or row extends from <code class="display"><span class="extract">w1</span></code> but may run only
|
|
part-way through: we look for the first point at which there is a
|
|
tab break (for column scanning) or a newline break (for row scanning),
|
|
and return the word position just before that break. If we do not find
|
|
one, it follows that the entire range holds the current column or row,
|
|
and we return <code class="display"><span class="extract">w2</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wordings::last_word_of_formatted_text<button class="popup" onclick="togglePopup('usagePopup108')">...<span class="popuptext" id="usagePopup108">Usage of <b>Wordings::last_word_of_formatted_text</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tab_flag</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::length</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> > </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">))</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">tab_flag</span><span class="plain">) && (</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::break_before</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\t'</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-lxr.html#SP17">Lexer::indentation_level</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::break_before</a></span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\n'</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">-1;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::last_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. The Writer. </b>The following implements the <code class="display"><span class="extract">%W</span></code> escape, which comes in four varieties:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Wordings::writer<button class="popup" onclick="togglePopup('usagePopup109')">...<span class="popuptext" id="usagePopup109">Usage of <b>Wordings::writer</b>:<br>Words Module - <a href="1-wm.html#SP3_2">§3.2</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">format_string</span><span class="plain">[0]) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'W'</span><span class="plain">: /* </span><span class="identifier">bare</span><span class="plain"> |%</span><span class="identifier">W</span><span class="plain">| </span><span class="identifier">means</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">same</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> |%-</span><span class="identifier">W</span><span class="plain">|, </span><span class="identifier">so</span><span class="plain"> </span><span class="identifier">fall</span><span class="plain"> </span><span class="identifier">through</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">... */</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">: </span><<span class="cwebmacro">Write the stream with normalised casing</span> <span class="cwebmacronumber">22.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'+'</span><span class="plain">: </span><<span class="cwebmacro">Write the stream raw</span> <span class="cwebmacronumber">22.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'<'</span><span class="plain">: </span><<span class="cwebmacro">Write the stream in an abbreviated raw form</span> <span class="cwebmacronumber">22.3</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">: </span><<span class="cwebmacro">Write the stream in a raw form suitable for use in an I6 literal string</span> <span class="cwebmacronumber">22.4</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad %W modifier"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_1"></a><b>§22.1. </b>Note that the empty wording causes nothing to be written to the stream.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Write the stream with normalised casing</span> <span class="cwebmacronumber">22.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"><</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::last_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="3-wrd.html#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_2"></a><b>§22.2. </b>Raw, in this context, means that it retains its original case, but not that
|
|
it retains its original spacing. This is sometimes problematic: we need to
|
|
go to some trouble to make punctuation look reasonably nice again, to obtain,
|
|
say,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The auctioneer said: "I'm not through yet -".</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">in preference to:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The auctioneer said : "I'm not through yet -" .</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Note that we are not actually preserving the spacing in the original source —
|
|
that might have line breaks or other curiosities which we don't want: we are
|
|
instead imposing what we think are normal English conventions. While this
|
|
will sometimes be wrong, this is only likely to affect the index and problem
|
|
messages, so the user is not likely to be bothered.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Write the stream raw</span> <span class="cwebmacronumber">22.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%<N"</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"><</span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::last_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">space</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">COMMA_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">COLON_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">OPENBRACKET_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">space</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="3-wrd.html#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_3"></a><b>§22.3. </b>A variation on this tries to contain unreasonably long pastes of quoted
|
|
literals, and is used in printing out problem messages, where quoting
|
|
back the offending source text might make unhelpfully vast paragraphs
|
|
in which the actual information is more or less hidden.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">STRING_TOLERANCE_LIMIT</span><span class="plain"> </span><span class="constant">70</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Write the stream in an abbreviated raw form</span> <span class="cwebmacronumber">22.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-wrd.html#SP12">Wordings::empty</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<no text>"</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</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">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">COMMA_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">COLON_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">SEMICOLON_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">CLOSEBRACE_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">OPENBRACE_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">OPENBRACKET_V</span><span class="plain">)) </span><span class="identifier">space</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">space</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_raw_text</a></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">L</span><span class="plain"> = </span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> > </span><span class="constant">STRING_TOLERANCE_LIMIT</span><span class="plain">+5) {</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">=0; </span><span class="identifier">j</span><span class="plain"><</span><span class="constant">STRING_TOLERANCE_LIMIT</span><span class="plain">/2; </span><span class="identifier">j</span><span class="plain">++) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">p</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">" [...] "</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="constant">STRING_TOLERANCE_LIMIT</span><span class="plain">/2; </span><span class="identifier">j</span><span class="plain">>0; </span><span class="identifier">j</span><span class="plain">--) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">L</span><span class="plain">-</span><span class="identifier">j</span><span class="plain">]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> >= </span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)+1) && (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">OPENI6_V</span><span class="plain">))) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"-)"</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">This code is used in <a href="3-wrd.html#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4"></a><b>§22.4. </b>Another variation, this time formatted for use in I6 double-quoted text.
|
|
Here we don't care about punctuation spacing, because we are only writing
|
|
in comments and I6 debugging routines, but we do need to use the I6 escape
|
|
<code class="display"><span class="extract">~</span></code> for a double-quotation mark.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Write the stream in a raw form suitable for use in an I6 literal string</span> <span class="cwebmacronumber">22.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain"> = </span><span class="functiontext"><a href="3-lxr.html#SP18">Lexer::word_raw_text</a></span><span class="plain">(</span><span class="identifier">j</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">></span><span class="functiontext"><a href="3-wrd.html#SP8">Wordings::first_wn</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</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">k</span><span class="plain">=0; </span><span class="identifier">str</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] != </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">k</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="identifier">str</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">];</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'@'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@@"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'^'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[cr]"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\\'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[backslash]"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</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">This code is used in <a href="3-wrd.html#SP22">§22</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="3-lxr.html">Back to 'Lexer'</a></li><li><a href="3-tff.html">Continue with 'Text From Files'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|