1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/2-bd.html

609 lines
66 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/ifi</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/bd' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">if</a></li><li><a href="index.html#2">Chapter 2: Bibliographic Data</a></li><li><b>Bibliographic Data</b></li></ul><p class="purpose">To manage the special variables providing bibliographic data on the work of IF being generated (title, author's name and so forth), and to write the Library Card in the index.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Much of this section is best understood by reference to the Treaty of
Babel, a cross-IF-system standard for bibliographic data and packaging
agreed between the major IF design systems in 2006. Inform aims to comply
fully with the Treaty and the code below should be maintained as such.
</p>
<p class="inwebparagraph">The bibliographic data for the story is kept in the following variables,
which are used to build the iFiction record and the releasing blurb at
the end of a successful compilation.
</p>
<pre class="display">
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_title_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_author_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_headline_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_genre_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_description_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_release_number_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">story_creation_year_VAR</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="identifier">episode_number</span><span class="plain"> = -1; </span> <span class="comment">for a work which is part of a numbered series</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">series_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This is organised as a plugin since it's all broadly IF-based, and not
something you'd expect in a general programming language. But the main
effect is only to make a small number of variables special.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_VARIABLE_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Bibliographic::bibliographic_new_variable_notify</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::start appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following grammar contains the names of all of the bibliographic
variables &mdash; those used to set entries on the Library Card about a project.
As usual, Inform uses these English wordings to detect the creation of the
variables in the Standard Rules, which are in English: so there's no point
in translating this nonterminal to other languages.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">bibliographic</span><span class="plain">-</span><span class="identifier">variables</span><span class="plain">&gt; ::=</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">title</span><span class="plain"> |</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">author</span><span class="plain"> |</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">headline</span><span class="plain"> |</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">genre</span><span class="plain"> |</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">description</span><span class="plain"> |</span>
<span class="identifier">story</span><span class="plain"> </span><span class="identifier">creation</span><span class="plain"> </span><span class="identifier">year</span><span class="plain"> |</span>
<span class="identifier">release</span><span class="plain"> </span><span class="identifier">number</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And we read them here:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">STORY_TITLE_BIBV</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">STORY_AUTHOR_BIBV</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">STORY_HEADLINE_BIBV</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">STORY_GENRE_BIBV</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">STORY_DESCRIPTION_BIBV</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">STORY_CREATION_YEAR_BIBV</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">RELEASE_NUMBER_BIBV</span><span class="plain"> 6</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::bibliographic_new_variable_notify</span><span class="plain">(</span><span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">bibliographic</span><span class="plain">-</span><span class="identifier">variables</span><span class="plain">&gt;(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) {</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">STORY_TITLE_BIBV</span><span class="plain">: </span><span class="identifier">story_title_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">STORY_AUTHOR_BIBV</span><span class="plain">: </span><span class="identifier">story_author_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">STORY_HEADLINE_BIBV</span><span class="plain">: </span><span class="identifier">story_headline_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">STORY_GENRE_BIBV</span><span class="plain">: </span><span class="identifier">story_genre_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">STORY_DESCRIPTION_BIBV</span><span class="plain">: </span><span class="identifier">story_description_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">STORY_CREATION_YEAR_BIBV</span><span class="plain">: </span><span class="identifier">story_creation_year_VAR</span><span class="plain"> = </span><span class="identifier">q</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="constant">RELEASE_NUMBER_BIBV</span><span class="plain">: </span><span class="identifier">story_release_number_VAR</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">NonlocalVariables::make_constant</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::bibliographic_new_variable_notify is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>This is what the top line of the main source text should look like, if it's
to declare the title and author.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ( </span><span class="identifier">in</span><span class="plain"> &lt;</span><span class="identifier">natural</span><span class="plain">-</span><span class="identifier">language</span><span class="plain">&gt; ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt; ::=</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} </span><span class="identifier">by</span><span class="plain"> ... | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">{&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>That grammar is used at two points: first, to spot the natural language
being used in the source text, something we have to look ahead to since
it affects the grammar needed to understand the rest of the file &mdash;
</p>
<pre class="display">
<span class="identifier">natural_language</span><span class="plain"> *</span><span class="functiontext">PL::Bibliographic::scan_language</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">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 PL::Bibliographic::scan_language appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>&mdash; and secondly, to parse the titling-line sentence in the regular way,
setting bibliographic variables as needed. The following is called on the
first sentence in the source text if and only if it begins with text in
double quotes:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::bibliographic_data</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">))) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">TW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">plain</span><span class="plain">-</span><span class="identifier">titling</span><span class="plain">-</span><span class="identifier">line</span><span class="plain">&gt;, 2);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">story_title_VAR</span><span class="plain">) &amp;&amp; (</span><span class="identifier">story_author_VAR</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Set the story title from the titling line</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Set the author from the titling line</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadTitleSentence</span><span class="plain">),</span>
<span class="string">"the initial bibliographic sentence can only be a title in double-quotes"</span><span class="plain">,</span>
<span class="string">"possibly followed with 'by' and the name of the author."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::bibliographic_data appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>We must not of course simply write to the variables; we call the assertion
machinery to generate an inference about their values, because that ensures
that contradictions, and so forth, are properly complained about.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set the story title from the titling line</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">the_title</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt;(</span><span class="identifier">TW</span><span class="plain">)) </span><span class="identifier">the_title</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">the_title</span><span class="plain"> = </span><span class="identifier">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">TW</span><span class="plain">);</span>
<span class="identifier">Assertions::PropertyKnowledge::initialise_global_variable</span><span class="plain">(</span><span class="identifier">story_title_VAR</span><span class="plain">, </span><span class="identifier">the_title</span><span class="plain">);</span>
<span class="identifier">Strings::TextLiterals::suppress_quote_expansion</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">the_title</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b>The author is often given outside of quotation marks:
</p>
<blockquote>
<p>"The Large Scale Structure of Space-Time" by Lindsay Lohan</p>
</blockquote>
<p class="inwebparagraph">and in such cases we transcribe the name-words into quotes so that we can
treat them as a text literal ("Lindsay Lohan").
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set the author from the titling line</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt;(</span><span class="identifier">AW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">%+W"</span><span class="plain">, </span><span class="identifier">AW</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">=1, </span><span class="identifier">L</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">)</span>
<span class="identifier">Str::put_at</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string"> "</span><span class="plain">);</span>
<span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">author_buffer</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">the_author</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt;(</span><span class="identifier">AW</span><span class="plain">)) </span><span class="identifier">the_author</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">the_author</span><span class="plain"> = </span><span class="identifier">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">);</span>
<span class="identifier">Assertions::PropertyKnowledge::initialise_global_variable</span><span class="plain">(</span><span class="identifier">story_author_VAR</span><span class="plain">, </span><span class="identifier">the_author</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>This unattractive routine performs a string comparison of the author's name
against one that's supplied, case sensitively, and is used when deciding
whether to print credits at run-time for extensions written by the same
person as the author of the main work.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::story_author_is</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">if</span><span class="plain"> ((</span><span class="identifier">story_author_VAR</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">story_author_VAR</span><span class="plain">))) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">NonlocalVariables::get_initial_value</span><span class="plain">(</span><span class="identifier">story_author_VAR</span><span class="plain">);</span>
<span class="identifier">ParseTree::set_kind_of_value</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">w1</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">TEMP</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">)) </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">result</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::story_author_is appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Inform probably shouldn't support this sentence, which does nothing other
than to fill in two pieces of rarely-used bibliographic data (which could
just as easily be variables). But two of the larger worked examples we were
trying Inform out on, in the early days, belonged to a sequence called
"When in Rome". So it didn't seem such an obscure request at the time.
</p>
<blockquote>
<p>This is episode 2 of "When in Rome".</p>
</blockquote>
<p class="inwebparagraph">The subject noun phrase is fixed, so the information is in the object NP,
which must match:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">episode</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; </span><span class="identifier">story</span><span class="plain"> |</span>
<span class="identifier">this</span><span class="plain"> </span><span class="identifier">story</span><span class="plain"> |</span>
<span class="identifier">story</span>
<span class="plain">&lt;</span><span class="identifier">episode</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="identifier">episode</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">of</span><span class="plain"> &lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">series</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2];</span>
<span class="identifier">episode</span><span class="plain"> ... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BadEpisode problem</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BadEpisode problem</span> <span class="cwebmacronumber">10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = -1;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadEpisode</span><span class="plain">),</span>
<span class="string">"this is not the right way to specify how the story "</span>
<span class="string">"fits into a larger narrative"</span><span class="plain">,</span>
<span class="string">"and should take the form 'The story is episode 2 of "</span>
<span class="string">"\</span><span class="plain">"</span><span class="string">Belt of Orion\</span><span class="plain">"</span><span class="string">, where the episode number has to be a "</span>
<span class="string">"whole number 0, 1, 2, ... and the series name has to be "</span>
<span class="string">"plain text without [substitutions]."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>This handles the special meaning "The story is episode...".
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::episode_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[0]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"The story is episode 2 of ..."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">episode</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">SW</span><span class="plain">)) &amp;&amp; (&lt;</span><span class="identifier">episode</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">))) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">verb_id_ANNOT</span><span class="plain">, </span><span class="identifier">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; &gt;= 0) {</span>
<span class="identifier">episode_number</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">Word::dequote</span><span class="plain">(&lt;&lt;</span><span class="identifier">series</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">series_name</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(&lt;&lt;</span><span class="identifier">series</span><span class="plain">&gt;&gt;);</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">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::episode_SMF appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>In the I6 template layer, some of the bibliographic variables are actually
compiled to constants, used early on at run-time to print the banner.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::compile_constants</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">encode_constant_text_bibliographically</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_I6_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">story_title_VAR</span><span class="plain">) </span>&lt;<span class="cwebmacro">Compile the I6 Story constant</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">story_headline_VAR</span><span class="plain">) </span>&lt;<span class="cwebmacro">Compile the I6 Headline constant</span> <span class="cwebmacronumber">12.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">story_author_VAR</span><span class="plain">) </span>&lt;<span class="cwebmacro">Compile the I6 Story Author constant</span> <span class="cwebmacronumber">12.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">story_release_number_VAR</span><span class="plain">) </span>&lt;<span class="cwebmacro">Compile the I6 Release directive</span> <span class="cwebmacronumber">12.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Compile the I6 serial number, based on the date</span> <span class="cwebmacronumber">12.5</span>&gt;<span class="plain">;</span>
<span class="identifier">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">encode_constant_text_bibliographically</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::compile_constants appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b>If the author doesn't name a work, then its title is properly "", not
"Welcome": that's just something we use to provide a readable banner.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile the I6 Story constant</span> <span class="cwebmacronumber">12.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">NonlocalVariables::treat_as_plain_text_word</span><span class="plain">(</span><span class="identifier">story_title_VAR</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">story_title_VAR</span><span class="plain">))</span>
<span class="identifier">NonlocalVariables::seek_initial_value</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">story_title_VAR</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">Strings::TextLiterals::compile_literal_from_text</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\</span><span class="plain">"</span><span class="string">Welcome\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Emit::named_generic_constant</span><span class="plain">(</span><span class="identifier">InterNames::iname</span><span class="plain">(</span><span class="identifier">Story_INAME</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_2"></a><b>&#167;12.2. </b>And similarly here:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile the I6 Headline constant</span> <span class="cwebmacronumber">12.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">story_headline_VAR</span><span class="plain">)) {</span>
<span class="identifier">NonlocalVariables::treat_as_plain_text_word</span><span class="plain">(</span><span class="identifier">story_headline_VAR</span><span class="plain">);</span>
<span class="identifier">NonlocalVariables::seek_initial_value</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">story_headline_VAR</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Strings::TextLiterals::compile_literal_from_text</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\</span><span class="plain">"</span><span class="string">An Interactive Fiction\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Emit::named_generic_constant</span><span class="plain">(</span><span class="identifier">InterNames::iname</span><span class="plain">(</span><span class="identifier">Headline_INAME</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_3"></a><b>&#167;12.3. </b>This time we compile nothing if no author is provided:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile the I6 Story Author constant</span> <span class="cwebmacronumber">12.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">story_author_VAR</span><span class="plain">)) {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="identifier">NonlocalVariables::treat_as_plain_text_word</span><span class="plain">(</span><span class="identifier">story_author_VAR</span><span class="plain">);</span>
<span class="identifier">NonlocalVariables::seek_initial_value</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">story_author_VAR</span><span class="plain">);</span>
<span class="identifier">Emit::named_generic_constant</span><span class="plain">(</span><span class="identifier">InterNames::iname</span><span class="plain">(</span><span class="identifier">Story_Author_INAME</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_4"></a><b>&#167;12.4. </b>Similarly (but numerically):
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile the I6 Release directive</span> <span class="cwebmacronumber">12.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">story_release_number_VAR</span><span class="plain">)) {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="identifier">NonlocalVariables::seek_initial_value</span><span class="plain">(&amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">story_release_number_VAR</span><span class="plain">);</span>
<span class="identifier">Emit::named_generic_constant</span><span class="plain">(</span><span class="identifier">InterNames::iname</span><span class="plain">(</span><span class="identifier">Release_INAME</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP12_5"></a><b>&#167;12.5. </b>This innocuous code &mdash; if Inform runs on 25 June 2013, we compile the serial
number "130625" &mdash; is actually controversial: quite a few users feel they
should be able to fake the date-stamp with dates of their own choosing.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile the I6 serial number, based on the date</span> <span class="cwebmacronumber">12.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">SN</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">year_digits</span><span class="plain"> = (</span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain">) % 100;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SN</span><span class="plain">, </span><span class="string">"%02d%02d%02d"</span><span class="plain">,</span>
<span class="identifier">year_digits</span><span class="plain">, (</span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain">)+1, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">);</span>
<span class="identifier">Emit::named_text_constant</span><span class="plain">(</span><span class="identifier">InterNames::iname</span><span class="plain">(</span><span class="identifier">Serial_INAME</span><span class="plain">), </span><span class="identifier">SN</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">SN</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>The Library Card is part of the Contents index, and is intended as a
natural way to present bibliographic data to the user. In effect, it's a
simplified form of the iFiction record, without the XML overhead.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::index_library_card</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"LCARD"</span><span class="plain">);</span>
<span class="identifier">HTML::begin_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"*bg_images/indexcard.png"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, 3, 3, 0, 0);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story title"</span><span class="plain">, </span><span class="identifier">story_title_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Untitled"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story author"</span><span class="plain">, </span><span class="identifier">story_author_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Anonymous"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story headline"</span><span class="plain">, </span><span class="identifier">story_headline_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"An Interactive Fiction"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story genre"</span><span class="plain">, </span><span class="identifier">story_genre_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Fiction"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">episode_number</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">episode_text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">episode_text</span><span class="plain">, </span><span class="string">"%d of %w"</span><span class="plain">, </span><span class="identifier">episode_number</span><span class="plain">, </span><span class="identifier">series_name</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Episode"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">episode_text</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">episode_text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Release number"</span><span class="plain">, </span><span class="identifier">story_release_number_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"1"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story creation year"</span><span class="plain">, </span><span class="identifier">story_creation_year_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"(This year)"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">NaturalLanguages::get_name</span><span class="plain">(</span><span class="identifier">language_of_play</span><span class="plain">));</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Language of play"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">lang</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">lang</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"IFID number"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="functiontext">PL::Bibliographic::IFID::read_uuid</span><span class="plain">());</span>
<span class="functiontext">PL::Bibliographic::library_card_entry</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Story description"</span><span class="plain">, </span><span class="identifier">story_description_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"None"</span><span class="plain">);</span>
<span class="identifier">HTML::end_html_table</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">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::index_library_card appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>This uses:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::library_card_entry</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">field</span><span class="plain">, </span><span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"303030"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain"> == </span><span class="identifier">story_title_VAR</span><span class="plain">) </span><span class="identifier">col</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"803030"</span><span class="plain">;</span>
<span class="identifier">HTML::first_html_column_nowrap</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0, </span><span class="identifier">NULL</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">col</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">typewritten\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">field</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</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::next_html_column</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">typewritten\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"b"</span><span class="plain">);</span>
<span class="functiontext">PL::Bibliographic::index_bibliographic_variable</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"b"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</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::end_html_row</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::library_card_entry is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>The Index also likes to print the name and authorship at the top of the
Contents listing, so:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::contents_heading</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">story_title_VAR</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">story_author_VAR</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">"Contents"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">PL::Bibliographic::index_bibliographic_variable</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">story_title_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Untitled"</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="functiontext">PL::Bibliographic::index_bibliographic_variable</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">story_author_VAR</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Anonymous"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::contents_heading appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>And both of those features use:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::index_bibliographic_variable</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
<span class="identifier">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="identifier">COMPILE_TEXT_TO_XML_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">nlv</span><span class="plain">) &amp;&amp; (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">))) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">NonlocalVariables::treat_as_plain_text_word</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">);</span>
<span class="identifier">HTMLFiles::compile_bibliographic_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Bibliographic::index_bibliographic_variable is used in <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-ifi.html">Back to 'Interactive Fiction ID'</a></li><li><a href="2-ri.html">Continue with 'Release Instructions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>