mirror of
https://github.com/ganelson/inform.git
synced 2024-07-18 06:54:26 +03:00
608 lines
94 KiB
HTML
608 lines
94 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>2/gnr</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '2/wrk' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</a></li><li><a href="index.html">inbuild</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>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Works</a></li><li><a href="#SP6">§6. The database of known works</a></li><li><a href="#SP10">§10. How casing is normalised</a></li><li><a href="#SP11">§11. Documentation links</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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>
|
|
<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>
|
|
<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>
|
|
|
|
<p class="endnote">The structure inbuild_work is accessed in 2/edt, 2/cps, 2/rqr, 2/nst, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/inc and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Each work structure is written only once, and its title and author name are
|
|
not subsequently altered. We therefore hash-code on arrival. As when
|
|
hashing vocabulary, we apply the X 30011 algorithm, this time with 499
|
|
(coprime to 30011) as base, to the text of the Unix-style pathname
|
|
<code class="display"><span class="extract">Author/Title</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">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 hash code is an integer between 0 and the following constant minus 1,
|
|
derived from its title and author name.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">WORK_HASH_CODING_BASE</span><span class="plain"> 499</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new</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">Works::new_inner</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>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new_raw</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">Works::new_inner</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>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="functiontext">Works::new_inner</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>
|
|
<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>
|
|
<span class="identifier">work</span><span class="plain">-</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">-</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">-</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">-</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">-</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>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">norm</span><span class="plain">) {</span>
|
|
<span class="functiontext">Works::normalise_casing</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">);</span>
|
|
<span class="functiontext">Works::normalise_casing</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-</span><span class="element">>title</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<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"> = 0;</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">-</span><span class="element">>author_name</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="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>
|
|
<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">-</span><span class="element">>title</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="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>
|
|
<span class="identifier">work</span><span class="plain">-</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>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">work</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_raw</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">raw_an</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">raw_ti</span><span class="plain">) {</span>
|
|
<span class="identifier">work</span><span class="plain">-</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">raw_an</span><span class="plain">);</span>
|
|
<span class="identifier">work</span><span class="plain">-</span><span class="element">>raw_title</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">raw_ti</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write</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">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">-</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>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write_to_HTML_file</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>
|
|
<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">-</span><span class="element">>raw_title</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::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>
|
|
<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">-</span><span class="element">>raw_author_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::write_link_to_HTML_file</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">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=\</span><span class="plain">"</span><span class="string">text-decoration: none\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="identifier">work</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-</span><span class="element">>title</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="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::is_standard_rules</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">-</span><span class="element">>title</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Works::write_to_HTML_file</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>
|
|
<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>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::writer</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>
|
|
<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">'<'</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>
|
|
<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">-</span><span class="element">>raw_title</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::is_standard_rules</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<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">-</span><span class="element">>raw_author_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'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">"<no extension>"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S by %S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-</span><span class="element">>raw_title</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-</span><span class="element">>raw_author_name</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">:</span>
|
|
<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>
|
|
|
|
<p class="endnote">The function Works::new is used in <a href="#SP5">§5</a>, 2/rqr (<a href="2-rqr.html#SP1">§1</a>), 3/is (<a href="3-is.html#SP1">§1</a>), 4/em (<a href="4-em.html#SP5">§5</a>), 4/lm (<a href="4-lm.html#SP4">§4</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/es (<a href="5-es.html#SP1">§1</a>), 5/ed (<a href="5-ed.html#SP10">§10</a>), 5/ps (<a href="5-ps.html#SP1">§1</a>), 6/hdn (<a href="6-hdn.html#SP12_3">§12.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::new_raw is used in 4/km (<a href="4-km.html#SP3">§3</a>), 4/pm (<a href="4-pm.html#SP5">§5</a>).</p>
|
|
|
|
<p class="endnote">The function Works::new_inner appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function Works::set_raw appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function Works::write is used in 2/edt (<a href="2-edt.html#SP1">§1</a>), 3/bg (<a href="3-bg.html#SP1">§1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::write_to_HTML_file is used in 5/ed (<a href="5-ed.html#SP19_2">§19.2</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">§3.2.1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::write_link_to_HTML_file is used in 5/ed (<a href="5-ed.html#SP20_1">§20.1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::writer is used in 1/im (<a href="1-im.html#SP3_3">§3.3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Two works with different hash codes definitely identify different extensions;
|
|
if the code is the same, we must use <code class="display"><span class="extract">strcmp</span></code> on the actual title and author
|
|
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
|
|
<code class="display"><span class="extract">strcmp</span></code>-style delta value. For <code class="display"><span class="extract">Works::compare</span></code>, see below...)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::match</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>
|
|
<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">if</span><span class="plain"> (</span><span class="identifier">eid1</span><span class="plain">-</span><span class="element">>inbuild_work_hash_code</span><span class="plain"> != </span><span class="identifier">eid2</span><span class="plain">-</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">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::match is used in <a href="#SP5">§5</a>, <a href="#SP6">§6</a>, <a href="#SP7">§7</a>, <a href="#SP8">§8</a>, 5/ed (<a href="5-ed.html#SP9">§9</a>, <a href="5-ed.html#SP18">§18</a>, <a href="5-ed.html#SP18_2">§18.2</a>), 5/ec (<a href="5-ec.html#SP3_1">§3.1</a>), 6/hdn (<a href="6-hdn.html#SP22">§22</a>, <a href="6-hdn.html#SP22_2">§22.2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>These are quite a deal slower, but trichotomous.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare</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>
|
|
<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="identifier">eid1</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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"> != 0) </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">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</span><span class="element">>title</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_title</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>
|
|
<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="identifier">eid1</span><span class="plain">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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"> != 0) </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">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_date</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>
|
|
<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">Works::get_sort_date</span><span class="plain">(</span><span class="identifier">eid2</span><span class="plain">), </span><span class="functiontext">Works::get_sort_date</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != 0) </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">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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"> != 0) </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">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::compare_by_length</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>
|
|
<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">Works::get_sort_word_count</span><span class="plain">(</span><span class="identifier">eid2</span><span class="plain">), </span><span class="functiontext">Works::get_sort_word_count</span><span class="plain">(</span><span class="identifier">eid1</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> != 0) </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">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</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"> != 0) </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">-</span><span class="element">>author_name</span><span class="plain">, </span><span class="identifier">eid2</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::compare is used in 5/ed (<a href="5-ed.html#SP18">§18</a>), 5/ec (<a href="5-ec.html#SP8">§8</a>).</p>
|
|
|
|
<p class="endnote">The function Works::compare_by_title is used in 5/ec (<a href="5-ec.html#SP8">§8</a>).</p>
|
|
|
|
<p class="endnote">The function Works::compare_by_date is used in 5/ec (<a href="5-ec.html#SP8">§8</a>).</p>
|
|
|
|
<p class="endnote">The function Works::compare_by_length is used in 5/ec (<a href="5-ec.html#SP8">§8</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>Because the Standard Rules 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.
|
|
</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</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">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">Works::new</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">Works::add_to_database</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>
|
|
<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">Works::match</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>
|
|
<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</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">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">Works::new</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">Works::add_to_database</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>
|
|
<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">Works::match</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>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::is_standard_rules is used in <a href="#SP2">§2</a>, 4/em (<a href="4-em.html#SP5">§5</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">§3.2.1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::is_basic_inform appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. The database of known works. </b>We will need to be able to give rapid answers to questions like "is there
|
|
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">
|
|
<span class="definitionkeyword">define</span> <span class="constant">NO_WDB_CONTEXTS</span><span class="plain"> 6</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">LOADED_WDBC</span><span class="plain"> 0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">INSTALLED_WDBC</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">HYPOTHETICAL_WDBC</span><span class="plain"> 3</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">USEWITH_WDBC</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">CLAIMED_WDBC</span><span class="plain"> 5</span>
|
|
</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>
|
|
<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>
|
|
<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</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>
|
|
<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"><</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>
|
|
|
|
<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">-</span><span class="element">>inbuild_work_hash_code</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>
|
|
<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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</span><span class="plain">)) {</span>
|
|
<span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">]++;</span>
|
|
<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>
|
|
<span class="identifier">iwde</span><span class="plain">-</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">-</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"><</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">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0;</span>
|
|
<span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">] = 1;</span>
|
|
<span class="identifier">iwde</span><span class="plain">-</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">-</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">-</span><span class="element">>word_count_text</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::add_to_database is used in <a href="#SP5">§5</a>, 4/km (<a href="4-km.html#SP4">§4</a>), 4/em (<a href="4-em.html#SP6">§6</a>), 4/lm (<a href="4-lm.html#SP5">§5</a>), 4/pbm (<a href="4-pbm.html#SP3">§3</a>), 4/pfm (<a href="4-pfm.html#SP3">§3</a>), 4/tm (<a href="4-tm.html#SP4">§4</a>), 4/pm (<a href="4-pm.html#SP5">§5</a>), 5/es (<a href="5-es.html#SP1">§1</a>), 5/ed (<a href="5-ed.html#SP10">§10</a>), 5/ec (<a href="5-ec.html#SP3_2">§3.2</a>), 6/hdn (<a href="6-hdn.html#SP12_3">§12.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>).</p>
|
|
|
|
<p class="endnote">The structure inbuild_work_database_entry is accessed in 2/edt, 2/cps, 2/rqr, 2/nst, 3/bg, 3/is2, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/hdn, 6/inc and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>This gives us reasonably rapid access to a shared date:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_usage_date</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>
|
|
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</span><span class="plain">)) {</span>
|
|
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>last_usage_date</span><span class="plain">, </span><span class="identifier">date</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_sort_date</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>
|
|
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</span><span class="plain">)) {</span>
|
|
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>sort_usage_date</span><span class="plain">, </span><span class="identifier">date</span><span class="plain">);</span>
|
|
<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_usage_date</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</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">iwde</span><span class="plain">-</span><span class="element">>last_usage_date</span><span class="plain">) > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] > 0)</span>
|
|
<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</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</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">iwde</span><span class="plain">-</span><span class="element">>sort_usage_date</span><span class="plain">) > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] > 0)</span>
|
|
<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>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::set_word_count</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>
|
|
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</span><span class="plain">)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>word_count_number</span><span class="plain"> = </span><span class="identifier">wc</span><span class="plain">;</span>
|
|
<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</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</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">iwde</span><span class="plain">-</span><span class="element">>word_count_text</span><span class="plain">) > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] > 0)</span>
|
|
<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>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::forgot</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</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">iwde</span><span class="plain">-</span><span class="element">>word_count_text</span><span class="plain">) > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::never</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</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">iwde</span><span class="plain">-</span><span class="element">>word_count_text</span><span class="plain">) > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="constant">DICTIONARY_REFERRED_WDBC</span><span class="plain">] > 0)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">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>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::get_word_count</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">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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="identifier">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>word_count_number</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::set_usage_date is used in 5/ed (<a href="5-ed.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function Works::set_sort_date is used in 5/ed (<a href="5-ed.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function Works::get_usage_date is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">§6.7.4.4</a>).</p>
|
|
|
|
<p class="endnote">The function Works::get_sort_date is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="endnote">The function Works::set_word_count is used in 5/ed (<a href="5-ed.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function Works::get_sort_word_count is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="endnote">The function Works::forgot is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">§6.7.4.4</a>).</p>
|
|
|
|
<p class="endnote">The function Works::never is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">§6.7.4.4</a>).</p>
|
|
|
|
<p class="endnote">The function Works::get_word_count is used in 5/ec (<a href="5-ec.html#SP6_7_4_4">§6.7.4.4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>The purpose of the hash table is to enable us to reply quickly when asked
|
|
for one of the following usage counts:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Works::no_times_used_in_context</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>
|
|
<span class="reserved">inbuild_work_database_entry</span><span class="plain"> *</span><span class="identifier">iwde</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">work</span><span class="plain">-</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">-</span><span class="element">>hash_next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Works::match</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">iwde</span><span class="plain">-</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">-</span><span class="element">>incidence_count</span><span class="plain">[</span><span class="identifier">context</span><span class="plain">];</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::no_times_used_in_context is used in 5/ed (<a href="5-ed.html#SP8">§8</a>), 5/ec (<a href="5-ec.html#SP7">§7</a>), 6/hdn (<a href="6-hdn.html#SP22">§22</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>The work hash table makes quite interesting reading, so:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::log_work_hash_table</span><span class="plain">(</span><span class="reserved">void</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="identifier">total</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Work identifier hash table:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<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"><</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>
|
|
<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">-</span><span class="element">>hash_next</span><span class="plain">) {</span>
|
|
<span class="identifier">total</span><span class="plain">++;</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%03d %3d %3d %3d %3d %X\</span><span class="plain">n</span><span class="string">"</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="element">>incidence_count</span><span class="plain">[0], </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[1],</span>
|
|
<span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[2], </span><span class="identifier">iwde</span><span class="plain">-</span><span class="element">>incidence_count</span><span class="plain">[3],</span>
|
|
<span class="identifier">iwde</span><span class="plain">-</span><span class="element">>work</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%d entries in all\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">total</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::log_work_hash_table is used in 5/ec (<a href="5-ec.html#SP11">§11</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. How casing is normalised. </b>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</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<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>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Works::normalise_casing is used in <a href="#SP2">§2</a>, 5/es (<a href="5-es.html#SP1_1_1">§1.1.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Documentation links. </b>This is where HTML links to extension documentation are created; the URL for
|
|
each extension's page is generated from its <code class="display"><span class="extract">inbuild_work</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::begin_extension_link</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>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"href='inform://Extensions/Extensions/"</span><span class="plain">);</span>
|
|
<span class="functiontext">Works::escape_apostrophes</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-</span><span class="element">>author_name</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">"/"</span><span class="plain">);</span>
|
|
<span class="functiontext">Works::escape_apostrophes</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-</span><span class="element">>title</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">".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">) > 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="string">"title=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> "</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=\</span><span class="plain">"</span><span class="string">%X\</span><span class="plain">"</span><span class="string"> "</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=\</span><span class="plain">"</span><span class="string">text-decoration: none\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"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</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="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="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="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">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>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Works::end_extension_link</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">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>
|
|
|
|
<p class="endnote">The function Works::begin_extension_link is used in 5/ec (<a href="5-ec.html#SP6_7_4_1">§6.7.4.1</a>).</p>
|
|
|
|
<p class="endnote">The function Works::escape_apostrophes appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function Works::end_extension_link is used in 5/ec (<a href="5-ec.html#SP6_7_4_1">§6.7.4.1</a>).</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-->
|
|
</body>
|
|
</html>
|
|
|