inweb-bootstrap/docs/foundation-module/8-bdfw.html

248 lines
31 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>8/ws</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '8/bdfw' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#8">Chapter 8: Literate Programming</a></li><li><b>Bibliographic Data for Webs</b></li></ul><p class="purpose">To manage key-value pairs of bibliographic data, metadata if you like, associated with a given web.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Storing data</a></li><li><a href="#SP4">&#167;4. Initialising a web</a></li><li><a href="#SP6">&#167;6. Reading bibliographic data</a></li><li><a href="#SP7">&#167;7. Writing bibliographic data</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Storing data. </b>There are never more than a dozen or so key-value pairs, and it's more
convenient to store them directly here than to use a dictionary.
</p>
<pre class="display">
<span class="identifier">typedef</span><span class="plain"> </span><span class="identifier">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</span><span class="plain"> {</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">;</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">;</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">declaration_permitted</span><span class="plain">; </span><span class="comment">is the contents page of the web allowed to set this?</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">declaration_mandatory</span><span class="plain">; </span><span class="comment">is it positively required to?</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">on_or_off</span><span class="plain">; </span><span class="comment">boolean: which we handle as the string "On" or "Off"</span>
<span class="identifier">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">alias</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">web_bibliographic_datum</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure web_bibliographic_datum is accessed in 2/dl, 2/dct, 5/ee and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>We keep these in linked lists, and here's a convenient way to scan them:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="identifier">LOOP_OVER_BIBLIOGRAPHIC_DATA</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">, </span><span class="reserved">web_bibliographic_datum</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">bibliographic_data</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following check the rules:
</p>
<pre class="display">
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bd</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="identifier">declaration_permitted</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_on_or_off</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bd</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="identifier">on_or_off</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::datum_can_be_declared is used in 8/ws (<a href="8-ws.html#SP7_3_2_1">&#167;7.3.2.1</a>).</p>
<p class="endnote">The function Bibliographic::datum_on_or_off is used in 8/ws (<a href="8-ws.html#SP7_3_2_1">&#167;7.3.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Initialising a web. </b>Each web has the following slate of data:
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Author"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Language"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Purpose"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Title"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"License"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">alias</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Licence"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">); </span><span class="comment">alias US to UK spelling</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Short Title"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Capitalized Title"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Date"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Number"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Prerelease"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Semantic Version Number"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"1"</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Name"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Index Template"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Preform Language"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Declare Section Usage"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">on_or_off</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Namespaces"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">on_or_off</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Strict Usage Rules"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">on_or_off</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Web Syntax Version"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::initialise_data is used in 8/ws (<a href="8-ws.html#SP5_1">&#167;5.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Once the declarations for a web have been processed, the following is called
to check that all the mandatory declarations have indeed been made:
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_BIBLIOGRAPHIC_DATA</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">)</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">value</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))</span>
<span class="functiontext">Errors::fatal_with_text</span><span class="plain">(</span>
<span class="string">"The web does not specify '%S: ...'"</span><span class="plain">, </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">key</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::check_required_data is used in 8/ws (<a href="8-ws.html#SP5_3">&#167;5.3</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Reading bibliographic data. </b>Key names are case-sensitive.
</p>
<pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bd</span><span class="plain">) </span><span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">value</span><span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="identifier">bd</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">value</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)) </span><span class="identifier">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_BIBLIOGRAPHIC_DATA</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">)</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">key</span><span class="plain">)) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">alias</span><span class="plain">) </span><span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">alias</span><span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::get_datum is used in 8/ws (<a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_3_1">&#167;7.2.2.3.1</a>), 8/bf (<a href="8-bf.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Bibliographic::data_exists appears nowhere else.</p>
<p class="endnote">The function Bibliographic::look_up_datum is used in <a href="#SP3">&#167;3</a>, <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Writing bibliographic data. </b>Note that a key-value pair is created if the key doesn't exist at present,
so this routine never fails.
</p>
<pre class="display">
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bd</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Create a new datum, then</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="identifier">else</span><span class="plain"> </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">value</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Title"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Also set a capitalized form</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="identifier">bd</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::set_datum is used in <a href="#SP4">&#167;4</a>, <a href="#SP7_2">&#167;7.2</a>, 8/ws (<a href="8-ws.html#SP7_3_2_1">&#167;7.3.2.1</a>), 8/bf (<a href="8-bf.html#SP5">&#167;5</a>, <a href="8-bf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create a new datum, then</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">bd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">web_bibliographic_datum</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">key</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">value</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_mandatory</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">declaration_permitted</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">on_or_off</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">alias</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">bd</span><span class="plain">, </span><span class="reserved">web_bibliographic_datum</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">bibliographic_data</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>A slightly foolish feature, this; if text like "Wuthering Heights" is
written to the "Title" key, then a full-caps "WUTHERING HEIGHTS" is
written to a "Capitalized Title" key. (This enables cover sheets which
want to typeset the title in full caps to do so.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Also set a capitalized form</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">recapped</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">recapped</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">recapped</span><span class="plain">)</span>
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">toupper</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)));</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Capitalized Title"</span><span class="plain">, </span><span class="identifier">recapped</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">recapped</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="8-ws.html">Back to 'Web Structure'</a></li><li><a href="8-wm.html">Continue with 'Web Modules'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>