1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/supervisor-module/2-wrk.html

628 lines
102 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Works</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<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>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">supervisor</span></a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</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="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Works' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#2">Chapter 2: Conceptual Framework</a></li><li><b>Works</b></li></ul><p class="purpose">To store, hash code and compare title/author pairs used to identify works.</p>
2020-02-27 13:18:25 +02:00
<ul class="toc"><li><a href="2-wrk.html#SP1">&#167;1. Works</a></li><li><a href="2-wrk.html#SP5">&#167;5. Printing</a></li><li><a href="2-wrk.html#SP8">&#167;8. Identification</a></li><li><a href="2-wrk.html#SP11">&#167;11. The database of known works</a></li><li><a href="2-wrk.html#SP15">&#167;15. Documentation links</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Works. </b>A "work" is a single artistic or programming creation; for example, the IF
story Bronze by Emily Short might be a work. Mamy versions of this IF story
may exist over time, but they will all be versions of the same "work".
Extensions are also works: for example, Epistemology by Eric Eve is a work.
</p>
<p class="inwebparagraph">Works are identified by the pair of title and author name, each of which is an
ISO Latin-1 string limited in length, with certain bad-news characters
excluded (such as <code class="display"><span class="extract">/</span></code> and <code class="display"><span class="extract">:</span></code>) so that they can be used directly in filenames.
However, we will not want to compare these by string comparison: so we
hash-code the combination for speed. The following structure holds a
combination of the textual names and the hash code:
</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">inbuild_work</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">genre</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">author_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">raw_author_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">raw_title</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inbuild_work_hash_code</span><span class="plain">; </span><span class="comment"> hash code derived from the above</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inbuild_work</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-14 19:56:54 +03:00
<p class="endnote">The structure inbuild_work is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps2, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
2020-02-27 13:18:25 +02:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Each work structure is written only once, and its title and author name are
2020-03-29 19:39:17 +03:00
not subsequently altered.
2020-02-27 13:18:25 +02:00
</p>
<pre class="definitions">
2020-04-07 03:06:09 +03:00
<span class="definitionkeyword">define</span> <span class="constant">WORK_HASH_CODING_BASE</span><span class="plain"> </span><span class="constant">499</span>
2020-02-27 13:18:25 +02:00
</pre>
<pre class="display">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new<button class="popup" onclick="togglePopup('usagePopup33')">...<span class="popuptext" id="usagePopup33">Usage of <b>Works::new</b>:<br><a href="2-wrk.html#SP10">&#167;10</a>, Requirements - <a href="2-rqr.html#SP2">&#167;2</a><br>Inter Skill - <a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a><br>Extension Manager - <a href="4-em.html#SP4">&#167;4</a><br>Language Manager - <a href="4-lm.html#SP3">&#167;3</a><br>Project Bundle Manager - <a href="4-pbm.html#SP2">&#167;2</a><br>Project File Manager - <a href="4-pfm.html#SP2">&#167;2</a><br>Template Manager - <a href="4-tm.html#SP3">&#167;3</a><br>Extension Services - <a href="5-es.html#SP2_3">&#167;2.3</a><br>Kits - <a href="5-ks.html#SP5_3">&#167;5.3</a>, <a href="5-ks.html#SP5_4">&#167;5.4</a>, <a href="5-ks.html#SP8">&#167;8</a><br>Language Services - <a href="5-ls.html#SP7">&#167;7</a><br>Headings - <a href="6-hdn.html#SP13_3">&#167;13.3</a><br>Inclusions - <a href="6-inc.html#SP5_1">&#167;5.1</a><br>Extension Dictionary - <a href="7-ed.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">genre</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ti</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-wrk.html#SP3">Works::new_inner</a></span><span class="plain">(</span><span class="identifier">genre</span><span class="plain">, </span><span class="identifier">ti</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new_raw<button class="popup" onclick="togglePopup('usagePopup34')">...<span class="popuptext" id="usagePopup34">Usage of <b>Works::new_raw</b>:<br>Kit Manager - <a href="4-km.html#SP3">&#167;3</a><br>Pipeline Manager - <a href="4-pm.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">genre</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ti</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-wrk.html#SP3">Works::new_inner</a></span><span class="plain">(</span><span class="identifier">genre</span><span class="plain">, </span><span class="identifier">ti</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Though it is probably the case that the author name and title supplied are
already of normalised casing, we do not want to rely on that. Works intending
to represent (e.g.) the same extension but named with different casing
conventions would fail to match: and this could happen if a new build of
Inform were published which made a subtle change to the casing conventions,
but which continued to use an extension dictionary file first written by
previous builds under the previous conventions.
</p>
<p class="inwebparagraph">The "raw", i.e., not case-normalised, forms of the title and author name are
preserved for use in text output, but not identification.
</p>
<pre class="display">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new_inner<button class="popup" onclick="togglePopup('usagePopup35')">...<span class="popuptext" id="usagePopup35">Usage of <b>Works::new_inner</b>:<br><a href="2-wrk.html#SP2">&#167;2</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">genre</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ti</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">norm</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain"> = </span><span class="identifier">genre</span><span class="plain">;</span>
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_author_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_title</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">ti</span><span class="plain">);</span>
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">ti</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">norm</span><span class="plain">) {</span>
<span class="functiontext"><a href="2-wrk.html#SP4">Works::normalise_casing</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
<span class="functiontext"><a href="2-wrk.html#SP4">Works::normalise_casing</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
&lt;<span class="cwebmacro">Compute the hash code</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">work</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>We hash-code all works on arrival, using the X 30011 algorithm, with 499
(coprime to 30011) as base, to the text of the pseudo-pathname <code class="display"><span class="extract">Author/Title</span></code>.
</p>
<p class="inwebparagraph">The hash code is an integer between 0 and the following constant minus 1,
derived from its title and author name.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compute the hash code</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">hc</span><span class="plain">*30011 + (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">hc</span><span class="plain">*30011 + (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="character">'/'</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">hc</span><span class="plain">*30011 + (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">hc</span><span class="plain"> % </span><span class="constant">WORK_HASH_CODING_BASE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">hc</span><span class="plain">;</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="2-wrk.html#SP3">&#167;3</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Casing is normalised as follows. Every word is capitalised, where a word
begins at the start of the text, after a hyphen, or after a bracket. Thus
"Every Word Counts", "Even Double-Barrelled Ones (And Even Parenthetically)".
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::normalise_casing<button class="popup" onclick="togglePopup('usagePopup36')">...<span class="popuptext" id="usagePopup36">Usage of <b>Works::normalise_casing</b>:<br><a href="2-wrk.html#SP3">&#167;3</a>, Extension Services - <a href="5-es.html#SP2_2_1">&#167;2.2.1</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
2020-03-29 19:39:17 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">boundary</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">boundary</span><span class="plain">) </span><span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">Characters::toupper</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">));</span>
<span class="identifier">boundary</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">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) </span><span class="identifier">boundary</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">c</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) </span><span class="identifier">boundary</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">c</span><span class="plain"> == </span><span class="character">'('</span><span class="plain">) </span><span class="identifier">boundary</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Printing. </b>As noted above, the raw forms are used for output.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write<button class="popup" onclick="togglePopup('usagePopup37')">...<span class="popuptext" id="usagePopup37">Usage of <b>Works::write</b>:<br>Editions - <a href="2-edt.html#SP1">&#167;1</a><br>Build Graphs - <a href="3-bg.html#SP7">&#167;7</a>, <a href="3-bg.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">, </span><span class="constant">GENRE_WRITE_WORK_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write_to_HTML_file<button class="popup" onclick="togglePopup('usagePopup38')">...<span class="popuptext" id="usagePopup38">Usage of <b>Works::write_to_HTML_file</b>:<br><a href="2-wrk.html#SP6">&#167;6</a>, Extension Dictionary - <a href="7-ed.html#SP19_2">&#167;19.2</a><br>Extension Documentation - <a href="7-ed2.html#SP3_2_1">&#167;3.2.1</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">fancy</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fancy</span><span class="plain">) </span><span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"404040"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fancy</span><span class="plain">) </span><span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The following is only sensible for extensions, and is used when Inform
generates its Extensions index entries.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write_link_to_HTML_file<button class="popup" onclick="togglePopup('usagePopup39')">...<span class="popuptext" id="usagePopup39">Usage of <b>Works::write_link_to_HTML_file</b>:<br>Extension Dictionary - <a href="7-ed.html#SP20_1">&#167;20.1</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"href='Extensions/%S/%S.html' style=\"text-decoration: none\""</span><span class="plain">,</span>
<span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"404040"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP10">Works::is_standard_rules</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="2-wrk.html#SP5">Works::write_to_HTML_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The Inbuild module provides the <code class="display"><span class="extract">%X</span></code> escape sequence for printing names of
works. (The X used to stand for Extension.) <code class="display"><span class="extract">%&lt;X</span></code> ptovides an abbreviated form.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::writer<button class="popup" onclick="togglePopup('usagePopup40')">...<span class="popuptext" id="usagePopup40">Usage of <b>Works::writer</b>:<br>Supervisor Module - <a href="1-sm.html#SP3_3">&#167;3.3</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">void</span><span class="plain"> *</span><span class="identifier">vE</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = (</span><span class="reserved">inbuild_work</span><span class="plain"> *) </span><span class="identifier">vE</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">'&lt;'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">work</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"source text"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="2-wrk.html#SP10">Works::is_standard_rules</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="2-wrk.html#SP10">Works::is_basic_inform</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by %S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<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">'X'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">work</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;no extension&gt;"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S by %S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_title</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">raw_author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">default:</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad %X extension"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Identification. </b>Two works with different hash codes definitely identify different works;
if the code is the same, we must use <code class="display"><span class="extract">Str::eq</span></code> on the actual title and author
2020-02-27 13:18:25 +02:00
name. This is in effect case insensitive, since we normalised casing when
the works were created.
</p>
<p class="inwebparagraph">(Note that this is not a lexicographic function suitable for sorting
works into alphabetical order: it cannot be, since the hash code is not
order-preserving. To emphasise this we return true or false rather than a
2020-03-29 19:39:17 +03:00
<code class="display"><span class="extract">strcmp</span></code>-style delta value.)
2020-02-27 13:18:25 +02:00
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::match<button class="popup" onclick="togglePopup('usagePopup41')">...<span class="popuptext" id="usagePopup41">Usage of <b>Works::match</b>:<br><a href="2-wrk.html#SP10">&#167;10</a>, <a href="2-wrk.html#SP11">&#167;11</a>, <a href="2-wrk.html#SP12">&#167;12</a>, <a href="2-wrk.html#SP13">&#167;13</a>, Headings - <a href="6-hdn.html#SP23">&#167;23</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a><br>Extension Dictionary - <a href="7-ed.html#SP9">&#167;9</a>, <a href="7-ed.html#SP18">&#167;18</a>, <a href="7-ed.html#SP18_2">&#167;18.2</a><br>Extension Census - <a href="7-ec.html#SP3_1">&#167;3.1</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid1</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid2</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eid1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">eid2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad work match"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="identifier">inbuild_work_hash_code</span><span class="plain"> != </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</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">Str::eq</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">author_name</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">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">title</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>
2020-02-27 13:18:25 +02:00
<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>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>These are quite a deal slower, but are trichotomous and can be used for
sorting.
2020-02-27 13:18:25 +02:00
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare<button class="popup" onclick="togglePopup('usagePopup42')">...<span class="popuptext" id="usagePopup42">Usage of <b>Works::compare</b>:<br>Extension Dictionary - <a href="7-ed.html#SP18">&#167;18</a><br>Extension Census - <a href="7-ec.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid1</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid2</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eid1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">eid2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad work match"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">d</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_title<button class="popup" onclick="togglePopup('usagePopup43')">...<span class="popuptext" id="usagePopup43">Usage of <b>Works::compare_by_title</b>:<br>Extension Census - <a href="7-ec.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid1</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid2</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eid1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">eid2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad work match"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">d</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_date<button class="popup" onclick="togglePopup('usagePopup44')">...<span class="popuptext" id="usagePopup44">Usage of <b>Works::compare_by_date</b>:<br>Extension Census - <a href="7-ec.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid1</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid2</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eid1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">eid2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad work match"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="functiontext"><a href="2-wrk.html#SP12">Works::get_sort_date</a></span><span class="plain">(</span><span class="identifier">eid2</span><span class="plain">), </span><span class="functiontext"><a href="2-wrk.html#SP12">Works::get_sort_date</a></span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">));</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</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">d</span><span class="plain">;</span>
<span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">d</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_length<button class="popup" onclick="togglePopup('usagePopup45')">...<span class="popuptext" id="usagePopup45">Usage of <b>Works::compare_by_length</b>:<br>Extension Census - <a href="7-ec.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid1</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">eid2</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eid1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">eid2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad work match"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="functiontext"><a href="2-wrk.html#SP12">Works::get_sort_word_count</a></span><span class="plain">(</span><span class="identifier">eid2</span><span class="plain">), </span><span class="functiontext"><a href="2-wrk.html#SP12">Works::get_sort_word_count</a></span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">));</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</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">d</span><span class="plain">;</span>
<span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">d</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Str::cmp</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Because Basic Inform and the Standard Rules extensions are treated slightly
differently by the documentation, and so forth, it's convenient to provide a
single function testing if a work refers to them.
2020-02-27 13:18:25 +02:00
</p>
<pre class="display">
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">a_work_for_standard_rules</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::is_standard_rules<button class="popup" onclick="togglePopup('usagePopup46')">...<span class="popuptext" id="usagePopup46">Usage of <b>Works::is_standard_rules</b>:<br><a href="2-wrk.html#SP6">&#167;6</a>, <a href="2-wrk.html#SP7">&#167;7</a>, Extension Manager - <a href="4-em.html#SP4">&#167;4</a><br>Extension Documentation - <a href="7-ed2.html#SP3_2_1">&#167;3.2.1</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a_work_for_standard_rules</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">a_work_for_standard_rules</span><span class="plain"> =</span>
<span class="functiontext"><a href="2-wrk.html#SP2">Works::new</a></span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Standard Rules"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Graham Nelson"</span><span class="plain">);</span>
<span class="functiontext"><a href="2-wrk.html#SP11">Works::add_to_database</a></span><span class="plain">(</span><span class="identifier">a_work_for_standard_rules</span><span class="plain">, </span><span class="constant">HYPOTHETICAL_WDBC</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">work</span><span class="plain"> == </span><span class="identifier">NULL</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="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">a_work_for_standard_rules</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">a_work_for_basic_inform</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::is_basic_inform<button class="popup" onclick="togglePopup('usagePopup47')">...<span class="popuptext" id="usagePopup47">Usage of <b>Works::is_basic_inform</b>:<br><a href="2-wrk.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a_work_for_basic_inform</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">a_work_for_basic_inform</span><span class="plain"> =</span>
<span class="functiontext"><a href="2-wrk.html#SP2">Works::new</a></span><span class="plain">(</span><span class="identifier">extension_genre</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Basic Inform"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Graham Nelson"</span><span class="plain">);</span>
<span class="functiontext"><a href="2-wrk.html#SP11">Works::add_to_database</a></span><span class="plain">(</span><span class="identifier">a_work_for_basic_inform</span><span class="plain">, </span><span class="constant">HYPOTHETICAL_WDBC</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">work</span><span class="plain"> == </span><span class="identifier">NULL</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="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">a_work_for_basic_inform</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. The database of known works. </b>We will need to be able to give rapid answers to questions like "is there
2020-02-27 13:18:25 +02:00
an installed extension with this work?" and "does any entry in the dictionary
relate to this work?": there may be many extensions and very many dictionary
entries, so we keep an incidence count of each work and in what context it
has been used, and store that in a hash table. Note that each distinct work
is recorded only once in the table: this is important, as although an
individual extension can only be loaded or installed once, it could be
referred to in the dictionary dozens or even hundreds of times.
</p>
<p class="inwebparagraph">The table is unsorted and is intended for rapid searching. Typically there
will be only a handful of works in the list of those with a given hash code:
indeed, the typical number will be 0 or 1.
</p>
<p class="inwebparagraph">Works are entered into the database with one of the following contexts:
</p>
<pre class="definitions">
2020-04-07 03:06:09 +03:00
<span class="definitionkeyword">define</span> <span class="constant">NO_WDB_CONTEXTS</span><span class="plain"> </span><span class="constant">6</span>
<span class="definitionkeyword">define</span> <span class="constant">LOADED_WDBC</span><span class="plain"> </span><span class="constant">0</span>
<span class="definitionkeyword">define</span> <span class="constant">INSTALLED_WDBC</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain"> </span><span class="constant">2</span>
<span class="definitionkeyword">define</span> <span class="constant">HYPOTHETICAL_WDBC</span><span class="plain"> </span><span class="constant">3</span>
<span class="definitionkeyword">define</span> <span class="constant">USEWITH_WDBC</span><span class="plain"> </span><span class="constant">4</span>
<span class="definitionkeyword">define</span> <span class="constant">CLAIMED_WDBC</span><span class="plain"> </span><span class="constant">5</span>
2020-02-27 13:18:25 +02:00
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work_database_entry</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">hash_next</span><span class="plain">; </span><span class="comment"> next one in hashed work database</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">NO_WDB_CONTEXTS</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">last_usage_date</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">sort_usage_date</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">word_count_text</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">word_count_number</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">inbuild_work_database_entry</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">work_database_created</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="constant">WORK_HASH_CODING_BASE</span><span class="plain">];</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::add_to_database<button class="popup" onclick="togglePopup('usagePopup48')">...<span class="popuptext" id="usagePopup48">Usage of <b>Works::add_to_database</b>:<br><a href="2-wrk.html#SP10">&#167;10</a>, Extension Manager - <a href="4-em.html#SP5">&#167;5</a><br>Kit Manager - <a href="4-km.html#SP4">&#167;4</a><br>Language Manager - <a href="4-lm.html#SP4">&#167;4</a><br>Pipeline Manager - <a href="4-pm.html#SP4">&#167;4</a><br>Project Bundle Manager - <a href="4-pbm.html#SP3">&#167;3</a><br>Project File Manager - <a href="4-pfm.html#SP3">&#167;3</a><br>Template Manager - <a href="4-tm.html#SP4">&#167;4</a><br>Extension Services - <a href="5-es.html#SP2">&#167;2</a><br>Headings - <a href="6-hdn.html#SP13_3">&#167;13.3</a><br>Inclusions - <a href="6-inc.html#SP5_1">&#167;5.1</a><br>Extension Dictionary - <a href="7-ed.html#SP10">&#167;10</a><br>Extension Census - <a href="7-ec.html#SP3_2">&#167;3.2</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">context</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">work_database_created</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">work_database_created</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">WORK_HASH_CODING_BASE</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">]++;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inbuild_work_database_entry</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">] = </span><span class="identifier">iwde</span><span class="plain">;</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">NO_WDB_CONTEXTS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</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="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">] = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">last_usage_date</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">sort_usage_date</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-14 19:56:54 +03:00
<p class="endnote">The structure inbuild_work_database_entry is accessed in 2/edt, 2/cps, 2/rqr, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps2, 6/hdn, 6/inc, 7/ed, 7/ed2, 7/ec and here.</p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>This gives us reasonably rapid access to a shared date:
2020-02-27 13:18:25 +02:00
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_usage_date<button class="popup" onclick="togglePopup('usagePopup49')">...<span class="popuptext" id="usagePopup49">Usage of <b>Works::set_usage_date</b>:<br>Extension Dictionary - <a href="7-ed.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">date</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">last_usage_date</span><span class="plain">, </span><span class="identifier">date</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_sort_date<button class="popup" onclick="togglePopup('usagePopup50')">...<span class="popuptext" id="usagePopup50">Usage of <b>Works::set_sort_date</b>:<br>Extension Dictionary - <a href="7-ed.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">date</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">sort_usage_date</span><span class="plain">, </span><span class="identifier">date</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Works::get_usage_date<button class="popup" onclick="togglePopup('usagePopup51')">...<span class="popuptext" id="usagePopup51">Usage of <b>Works::get_usage_date</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">last_usage_date</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">last_usage_date</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"Once upon a time"</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"Never"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"---"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Works::get_sort_date<button class="popup" onclick="togglePopup('usagePopup52')">...<span class="popuptext" id="usagePopup52">Usage of <b>Works::get_sort_date</b>:<br><a href="2-wrk.html#SP9">&#167;9</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">sort_usage_date</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">sort_usage_date</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"00000000000000Once upon a time"</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"00000000000000Never"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"000000000000000"</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_word_count<button class="popup" onclick="togglePopup('usagePopup53')">...<span class="popuptext" id="usagePopup53">Usage of <b>Works::set_word_count</b>:<br>Extension Dictionary - <a href="7-ed.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">wc</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain">, </span><span class="string">"%08d words"</span><span class="plain">, </span><span class="identifier">wc</span><span class="plain">);</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_number</span><span class="plain"> = </span><span class="identifier">wc</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Works::get_sort_word_count<button class="popup" onclick="togglePopup('usagePopup54')">...<span class="popuptext" id="usagePopup54">Usage of <b>Works::get_sort_word_count</b>:<br><a href="2-wrk.html#SP9">&#167;9</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"00000000I did read this, but forgot"</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"00000000I've never read this"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"---"</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::forgot<button class="popup" onclick="togglePopup('usagePopup55')">...<span class="popuptext" id="usagePopup55">Usage of <b>Works::forgot</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<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">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::never<button class="popup" onclick="togglePopup('usagePopup56')">...<span class="popuptext" id="usagePopup56">Usage of <b>Works::never</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_text</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] &gt; </span><span class="constant">0</span><span class="plain">)</span>
2020-02-27 13:18:25 +02:00
<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">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::get_word_count<button class="popup" onclick="togglePopup('usagePopup57')">...<span class="popuptext" id="usagePopup57">Usage of <b>Works::get_word_count</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_4">&#167;6.7.4.4</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain"> = </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">word_count_number</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>The purpose of the hash table is to enable us to reply quickly when asked
2020-02-27 13:18:25 +02:00
for one of the following usage counts:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::no_times_used_in_context<button class="popup" onclick="togglePopup('usagePopup58')">...<span class="popuptext" id="usagePopup58">Usage of <b>Works::no_times_used_in_context</b>:<br>Headings - <a href="6-hdn.html#SP23">&#167;23</a><br>Extension Dictionary - <a href="7-ed.html#SP8">&#167;8</a><br>Extension Census - <a href="7-ec.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">context</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">inbuild_work_hash_code</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-wrk.html#SP8">Works::match</a></span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">];</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The work hash table makes quite interesting reading, so:
2020-02-27 13:18:25 +02:00
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::log_work_hash_table<button class="popup" onclick="togglePopup('usagePopup59')">...<span class="popuptext" id="usagePopup59">Usage of <b>Works::log_work_hash_table</b>:<br>Extension Census - <a href="7-ec.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hc</span><span class="plain">, </span><span class="identifier">total</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Work identifier hash table:\n"</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">hc</span><span class="plain">=0; </span><span class="identifier">hc</span><span class="plain">&lt;</span><span class="constant">WORK_HASH_CODING_BASE</span><span class="plain">; </span><span class="identifier">hc</span><span class="plain">++) {</span>
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">hash_of_works</span><span class="plain">[</span><span class="identifier">hc</span><span class="plain">]; </span><span class="identifier">iwde</span><span class="plain">; </span><span class="identifier">iwde</span><span class="plain"> = </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">hash_next</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">total</span><span class="plain">++;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%03d %3d %3d %3d %3d %X\n"</span><span class="plain">,</span>
<span class="identifier">hc</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="identifier">incidence_count</span><span class="plain">[0], </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[1],</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[2], </span><span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">incidence_count</span><span class="plain">[3],</span>
<span class="identifier">iwde</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%d entries in all\n"</span><span class="plain">, </span><span class="identifier">total</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Documentation links. </b>This is where HTML links to extension documentation are created; the URL for
2020-02-27 13:18:25 +02:00
each extension's page is generated from its <code class="display"><span class="extract">inbuild_work</span></code>.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::begin_extension_link<button class="popup" onclick="togglePopup('usagePopup60')">...<span class="popuptext" id="usagePopup60">Usage of <b>Works::begin_extension_link</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_1">&#167;6.7.4.1</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">rubric</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"href='inform://Extensions/Extensions/"</span><span class="plain">);</span>
<span class="functiontext"><a href="2-wrk.html#SP15">Works::escape_apostrophes</a></span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"/"</span><span class="plain">);</span>
<span class="functiontext"><a href="2-wrk.html#SP15">Works::escape_apostrophes</a></span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">".html' "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">rubric</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"title=\"%S\" "</span><span class="plain">, </span><span class="identifier">rubric</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"title=\"%X\" "</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"style=\"text-decoration: none\""</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">link</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::escape_apostrophes<button class="popup" onclick="togglePopup('usagePopup61')">...<span class="popuptext" id="usagePopup61">Usage of <b>Works::escape_apostrophes</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\''</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\"'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'&amp;'</span><span class="plain">) ||</span>
2020-02-27 13:18:25 +02:00
<span class="plain">(</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'&lt;'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'&gt;'</span><span class="plain">) || (</span><span class="identifier">c</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">"%%%x"</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="reserved">else</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>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::end_extension_link<button class="popup" onclick="togglePopup('usagePopup62')">...<span class="popuptext" id="usagePopup62">Usage of <b>Works::end_extension_link</b>:<br>Extension Census - <a href="7-ec.html#SP6_7_4_1">&#167;6.7.4.1</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-gnr.html">Back to 'Genres'</a></li><li><a href="2-edt.html">Continue with 'Editions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
2020-04-14 19:56:54 +03:00
<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">
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>