1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-18 06:54:26 +03:00
inform7/docs/if-module/2-ifi.html
Graham Nelson 1268a0f40e Colonised
2020-04-14 17:56:54 +01:00

132 lines
10 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Interactive Fiction ID</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="index.html"><span class="selectedlink">if</span></a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Interactive Fiction ID' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">if</a></li><li><a href="index.html#2">Chapter 2: Bibliographic Data</a></li><li><b>Interactive Fiction ID</b></li></ul><p class="purpose">Computes and makes available the IFID (Interactive Fiction ID) number for an Inform-generated work of IF, in compliance with the Treaty of Babel.</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>The Interactive Fiction ID number for an Inform 7-compiled work is the
same as the UUID unique ID generated by the Inform 7 application.
</p>
<p class="inwebparagraph">UUIDs are not generated here, but by the user interface application: we expect
to read them in the form of the <code class="display"><span class="extract">uuid.txt</span></code> file placed in the project bundle
by that application. After some agonising, I decided that the Treaty did not
actually oblige me to crash out if this file did not exist: but in such
cases the UUID is empty.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_UUID_LENGTH</span><span class="plain"> </span><span class="constant">128</span><span class="plain"> </span><span class="comment"> the UUID is truncated to this if necessary</span>
</pre>
<pre class="display">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">uuid_text</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">uuid_read</span><span class="plain"> = -1;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">PL::Bibliographic::IFID::read_uuid<button class="popup" onclick="togglePopup('usagePopup2')">...<span class="popuptext" id="usagePopup2">Usage of <b>PL::Bibliographic::IFID::read_uuid</b>:<br><a href="#SP3">&#167;3</a>, Bibliographic Data - <a href="2-bd.html#SP11">&#167;11</a><br>Release Instructions - <a href="2-ri.html#SP11_1_1">&#167;11.1.1</a>, <a href="2-ri.html#SP14_2_5">&#167;14.2.5</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uuid_read</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">uuid_text</span><span class="plain">;</span>
<span class="identifier">uuid_text</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">uuid_read</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">xf</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">Task::uuid_file</span><span class="plain">(), </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">xf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">uuid_text</span><span class="plain">; </span><span class="comment"> the UUID is the empty string if the file is missing</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (((</span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">fgetc</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">)) != </span><span class="identifier">EOF</span><span class="plain">) </span><span class="comment"> the UUID file is plain text, not Unicode</span>
<span class="plain">&amp;&amp; (</span><span class="identifier">uuid_read</span><span class="plain">++ &lt; </span><span class="constant">MAX_UUID_LENGTH</span><span class="plain">-1))</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">uuid_text</span><span class="plain">, </span><span class="identifier">Characters::toupper</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">));</span>
<span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">xf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">uuid_text</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The IFID is written into the compiled story file, too, both in order
that it can be printed by the VERSION command and to brand the file so
that it can still be identified even if it loses touch with its iFiction
record. We store the IFID in plain text, with a "magic string" identifier
around it, in byte-accessible memory.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Bibliographic::IFID::define_UUID<button class="popup" onclick="togglePopup('usagePopup3')">...<span class="popuptext" id="usagePopup3">Usage of <b>PL::Bibliographic::IFID::define_UUID</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">uuid</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">PL::Bibliographic::IFID::read_uuid</a></span><span class="plain">();</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">UUID_array_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">UUID_ARRAY_HL</span><span class="plain">);</span>
<span class="identifier">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">UUID_array_iname</span><span class="plain">, </span><span class="identifier">uuid</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">UUID_array_iname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Bibliographic::IFID::UUID<button class="popup" onclick="togglePopup('usagePopup4')">...<span class="popuptext" id="usagePopup4">Usage of <b>PL::Bibliographic::IFID::UUID</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">UUID_ARRAY_HL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 2: Bibliographic Data.)</i></li><li><a href="2-bd.html">Continue with 'Bibliographic Data'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</main>
</body>
</html>