1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-28 21:14:57 +03:00

Completed work on multimedia

This commit is contained in:
Graham Nelson 2021-02-21 12:44:25 +00:00
parent f76c192a24
commit 1a51ff6499
33 changed files with 939 additions and 602 deletions

View file

@ -276,7 +276,7 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">runtime_kind_structure</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">test_scenario</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>And finally <a href="../index-module/index.html" class="internal">index</a> &mdash;
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b><a href="../index-module/index.html" class="internal">index</a> &mdash;
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">contents_entry_CLASS</span>
@ -292,6 +292,18 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_page</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_lexicon_entry</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b><a href="../multimedia-module/index.html" class="internal">multimedia</a> &mdash;
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">figures_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">sounds_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">files_data_CLASS</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">figures_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">sounds_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_data</span><span class="plain-syntax">)</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="1-cm.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresscurrentchapter">1</li><li class="progresssection"><a href="1-cm.html">cm</a></li><li class="progresscurrent">cp</li><li class="progresssection"><a href="1-wtc.html">wtc</a></li><li class="progresssection"><a href="1-htc.html">htc</a></li><li class="progresssection"><a href="1-cp2.html">cp2</a></li><li class="progresssection"><a href="1-pp.html">pp</a></li><li class="progresssection"><a href="1-cs.html">cs</a></li><li class="progresssection"><a href="1-inaa.html">inaa</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-pm.html">3</a></li><li class="progressnext"><a href="1-wtc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -325,7 +325,7 @@ so on. Those absolute basics are made here.
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Phrases::Manager::rulebooks_array</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH_IF</span><span class="plain-syntax">(</span><span class="identifier-syntax">scenes_plugin</span><span class="plain-syntax">, </span><span class="identifier-syntax">PL::Scenes::DetectSceneChange_routine</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH_IF</span><span class="plain-syntax">(</span><span class="identifier-syntax">scenes_plugin</span><span class="plain-syntax">, </span><span class="identifier-syntax">PL::Scenes::ShowSceneStatus_routine</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">ExternalFiles::arrays</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTExternalFiles::arrays</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Rulebooks::rulebook_var_creators</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Activities::activity_var_creators</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTRelations::IterateRelations</span><span class="plain-syntax">)</span>

View file

@ -758,7 +758,7 @@ to show, hide and colour things:
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MULTIMEDIA_MODULE</span>
<span class="plain-syntax"> </span><a href="3-fgr.html#SP1" class="function-link"><span class="function-syntax">IXFigures::index_all</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-se.html#SP1" class="function-link"><span class="function-syntax">IXSounds::index_all</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ExternalFiles::index_all</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-ef.html#SP1" class="function-link"><span class="function-syntax">IXExternalFiles::index_all</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -943,7 +943,7 @@ the source text in the application.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Index::link</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Index::link</span></span>:<br/>Lexicon Index - <a href="2-li.html#SP7_11_2">&#167;7.11.2</a>, <a href="2-li.html#SP8">&#167;8</a><br/>Index Physical World - <a href="2-ipw.html#SP3_5">&#167;3.5</a>, <a href="2-ipw.html#SP3_8">&#167;3.8</a>, <a href="2-ipw.html#SP4">&#167;4</a><br/>Kinds Index - <a href="2-ki.html#SP6">&#167;6</a><br/>Index Extensions - <a href="2-ie.html#SP1">&#167;1</a><br/>Instances - <a href="2-ins.html#SP5">&#167;5</a><br/>Adjectives - <a href="2-adj.html#SP1">&#167;1</a><br/>Variables - <a href="2-vrb.html#SP3">&#167;3</a><br/>Inferences - <a href="2-inf.html#SP3">&#167;3</a><br/>Figures - <a href="3-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="3-se.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Index::link</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Index::link</span></span>:<br/>Lexicon Index - <a href="2-li.html#SP7_11_2">&#167;7.11.2</a>, <a href="2-li.html#SP8">&#167;8</a><br/>Index Physical World - <a href="2-ipw.html#SP3_5">&#167;3.5</a>, <a href="2-ipw.html#SP3_8">&#167;3.8</a>, <a href="2-ipw.html#SP4">&#167;4</a><br/>Kinds Index - <a href="2-ki.html#SP6">&#167;6</a><br/>Index Extensions - <a href="2-ie.html#SP1">&#167;1</a><br/>Instances - <a href="2-ins.html#SP5">&#167;5</a><br/>Adjectives - <a href="2-adj.html#SP1">&#167;1</a><br/>Variables - <a href="2-vrb.html#SP3">&#167;3</a><br/>Inferences - <a href="2-inf.html#SP3">&#167;3</a><br/>Figures - <a href="3-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="3-se.html#SP1">&#167;1</a><br/>External Files - <a href="3-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ifs.html#SP9" class="function-link"><span class="function-syntax">Index::link_to_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Lexer::word_location</span><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

128
docs/index-module/3-ef.html Normal file
View file

@ -0,0 +1,128 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>External Files</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/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="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="index.html"><span class="selectedlink">index</span></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>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</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="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'External Files' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">index</a></li><li><a href="index.html#3">Chapter 3: Indexing for Plugins</a></li><li><b>External Files</b></li></ul></div>
<p class="purpose">To produce the index of external files.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>This is more or less perfunctory, but still of some use, if only as a list.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IXExternalFiles::index_all</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">IXExternalFiles::index_all</span></span>:<br/>Index File Services - <a href="2-ifs.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">files_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_data</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"This project doesn't read or write external files."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;b&gt;List of External Files&lt;/b&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::begin_html_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="string-syntax">"#ffffff"</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">, </span><span class="identifier-syntax">files_data</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::first_html_column</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">THUMBNAIL_WIDTH</span><span class="plain-syntax">+10);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">file_is_binary</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"img"</span><span class="plain-syntax">, </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/exf_binary.png\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"img"</span><span class="plain-syntax">, </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/exf_text.png\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&amp;nbsp;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::next_html_column</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ifs.html#SP9" class="function-link"><span class="function-syntax">Index::link</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG</span><span class="plain-syntax">(</span><span class="string-syntax">"br"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Filename: %s %N- owned by "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">file_is_binary</span><span class="plain-syntax">)?</span><span class="string-syntax">"- binary "</span><span class="plain-syntax">:</span><span class="string-syntax">""</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">unextended_filename</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">file_ownership</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_THIS_PROJECT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"this project"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_ANOTHER_PROJECT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"another project"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_SPECIFIC_PROJECT:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"project with IFID number &lt;b&gt;%S&lt;/b&gt;"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">IFID_of_owner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_row</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-se.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifs.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-fgr.html">fgr</a></li><li class="progresssection"><a href="3-se.html">se</a></li><li class="progresscurrent">ef</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -165,7 +165,7 @@ to match this width, preserving the aspect ratio.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-inf.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifs.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="3-se.html">se</a></li><li class="progressnext"><a href="3-se.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-inf.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifs.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="3-se.html">se</a></li><li class="progresssection"><a href="3-ef.html">ef</a></li><li class="progressnext"><a href="3-se.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -191,7 +191,7 @@ function togglePopup(material_id) {
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifs.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifs.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progresssection"><a href="3-ef.html">ef</a></li><li class="progressnext"><a href="3-ef.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -154,6 +154,11 @@
<spon class="sectiontitle">Sound Effects</span></a> -
<span class="sectionpurpose">To produce the index of sound effects.</span></p>
</li>
<li>
<p class="sectionentry"><a href="3-ef.html">
<spon class="sectiontitle">External Files</span></a> -
<span class="sectionpurpose">To produce the index of external files.</span></p>
</li>
</ul>
</li>
</ul>

View file

@ -71,42 +71,35 @@ which use this module:
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MULTIMEDIA_MODULE</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>This module defines the following classes:
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Like all modules, this one must define a <span class="extract"><span class="extract-syntax">start</span></span> and <span class="extract"><span class="extract-syntax">end</span></span> function:
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">figures_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">sounds_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">external_file_CLASS</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">figures_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">sounds_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">external_file</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">plugin</span><span class="plain-syntax"> *</span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">figures_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">sounds_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Like all modules, this one must define a <span class="extract"><span class="extract-syntax">start</span></span> and <span class="extract"><span class="extract-syntax">end</span></span> function:
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">FIGURE_CREATIONS_DA</span>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">MULTIMEDIA_CREATIONS_DA</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">MultimediaModule::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"multimedia"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">figures_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-fgr.html#SP1" class="function-link"><span class="function-syntax">Figures::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"figures"</span><span class="plain-syntax">, </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sounds_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-se.html#SP1" class="function-link"><span class="function-syntax">Sounds::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"sounds"</span><span class="plain-syntax">, </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-ef.html#SP4" class="function-link"><span class="function-syntax">ExternalFiles::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"glulx external files"</span><span class="plain-syntax">, </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">figures_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-fgr.html#SP1" class="function-link"><span class="function-syntax">Figures::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"figures"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sounds_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-se.html#SP1" class="function-link"><span class="function-syntax">Sounds::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"sounds"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PluginManager::new</span><span class="plain-syntax">(&amp;</span><a href="2-ef.html#SP1" class="function-link"><span class="function-syntax">ExternalFiles::start</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"glulx external files"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">FIGURE_CREATIONS_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"figure creations"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">MULTIMEDIA_CREATIONS_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"figure creations"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">MultimediaModule::end</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Note that the "multimedia" plugin itself does nothihg except to be a parent
to the other three; it doesn't even have an activation function.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">plugin</span><span class="plain-syntax"> *</span><span class="identifier-syntax">multimedia_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">figures_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">sounds_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">;</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">1</li><li class="progresscurrent">mm</li><li class="progresschapter"><a href="2-fgr.html">2</a></li><li class="progressnext"><a href="2-fgr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="P-wtmd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresscurrentchapter">1</li><li class="progresscurrent">mm</li><li class="progresschapter"><a href="2-fgr.html">2</a></li><li class="progressnext"><a href="2-fgr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -73,97 +73,55 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">multimedia</a></li><li><a href="index.html#2">Chapter 2: Multimedia Features</a></li><li><b>External Files</b></li></ul></div>
<p class="purpose">To register the names associated with external files, and build the small I6 arrays associated with each.</p>
<ul class="toc"><li><a href="2-ef.html#SP11">&#167;11. I6 arrays of file structures</a></li><li><a href="2-ef.html#SP12">&#167;12. External Files Index</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-ef.html#SP2">&#167;2. One special meaning</a></li><li><a href="2-ef.html#SP6">&#167;6. One significant kind</a></li><li><a href="2-ef.html#SP8">&#167;8. Significant new instances</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>The test group <span class="extract"><span class="extract-syntax">:files</span></span> exercises the features below.
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>The test group <span class="extract"><span class="extract-syntax">:files</span></span> exercises the features in this plugin.
</p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Each file can be text or binary, has a name, and can be owned by a this
project, by an unspecified other project, or by a project named by IFID.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_THIS_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_ANOTHER_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_SPECIFIC_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">files_data</span><span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">unextended_filename</span><span class="plain-syntax">; </span><span class="comment-syntax"> word number of text like </span><span class="extract"><span class="extract-syntax">"bones"</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf_I6_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 identifier</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_is_binary</span><span class="plain-syntax">; </span><span class="comment-syntax"> true or false</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_ownership</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the above</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IFID_of_owner</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 identifier</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IFID_array_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">external_file</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure external_file is accessed in 2/fgr, 2/se and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A <span class="extract"><span class="extract-syntax">--&gt;</span></span> array to a run-time data structure associated
with an external file, read or written by the story file during play.
<p class="commentary">The following is called to activate the plugin:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">MAKE_SPECIAL_MEANINGS_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP5" class="function-link"><span class="function-syntax">ExternalFiles::make_special_meanings</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP5" class="function-link"><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_INSTANCE_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP5" class="function-link"><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span></a><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">MAKE_SPECIAL_MEANINGS_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP2" class="function-link"><span class="function-syntax">ExternalFiles::make_special_meanings</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP7" class="function-link"><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_INSTANCE_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-ef.html#SP9" class="function-link"><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::make_special_meanings</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::make_special_meanings</span></span>:<br/><a href="2-ef.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SpecialMeanings::declare</span><span class="plain-syntax">(</span><a href="2-ef.html#SP10" class="function-link"><span class="function-syntax">ExternalFiles::new_file_SMF</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"new-file"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span></span>:<br/><a href="2-ef.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"EXTERNAL_FILE_TY"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">new_base</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span></span>:<br/><a href="2-ef.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">nc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BackdoorFileCreation</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this is not the way to create a new external file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which should be done with a special 'The File ... is called ...' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"sentence."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ATTACH_PLUGIN_DATA_TO_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">files</span><span class="plain-syntax">, </span><span class="identifier-syntax">nc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_subject</span><span class="plain-syntax">, </span><a href="2-ef.html#SP6" class="function-link"><span class="function-syntax">ExternalFiles::new_external_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nc</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">external_file</span><span class="plain-syntax"> *</span><span class="function-syntax">ExternalFiles::new_external_file</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::new_external_file</span></span>:<br/><a href="2-ef.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">external_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>External files are created with a special sentence:
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. One special meaning. </b>We add one special meaning for assertions, to catch sentences with the shape:
</p>
<blockquote>
<p>The File of Wisdom (owned by another project) is called "wisdom".</p>
</blockquote>
<p class="commentary">Here is the subject:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::make_special_meanings</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::make_special_meanings</span></span>:<br/><a href="2-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SpecialMeanings::declare</span><span class="plain-syntax">(</span><a href="2-ef.html#SP2" class="function-link"><span class="function-syntax">ExternalFiles::new_file_SMF</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"new-file"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::new_file_SMF</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">[0]):</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">[1]):</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">task</span><span class="plain-syntax">) { </span><span class="comment-syntax"> "File... is the file..."</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ACCEPT_SMFT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;nounphrase-external-file&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="function-syntax">&lt;new-file-sentence-object&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">OW</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">O</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;np-unparsed&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">O</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PASS_1_SMFT:</span>
<span class="plain-syntax"> </span><a href="2-ef.html#SP5" class="function-link"><span class="function-syntax">ExternalFiles::register_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And this is the Preform grammar needed for the subject phrase:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -180,10 +138,10 @@ with an external file, read or written by the story file during play.
<span class="Preform-function-syntax">&lt;external-file-owner&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">another</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">project</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">project</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{&lt;quoted-text-without-subs&gt;}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_BadFileOwner problem</span><span class="named-paragraph-number">7.1</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_BadFileOwner problem</span><span class="named-paragraph-number">3.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_BadFileOwner problem</span><span class="named-paragraph-number">7.1</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_BadFileOwner problem</span><span class="named-paragraph-number">3.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -200,8 +158,8 @@ with an external file, read or written by the story file during play.
<span class="plain-syntax"> </span><span class="string-syntax">"is called \"wisdom\".'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>The object NP is simply quoted text. Although the Preform grammar doesn't
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The object phrase is simply quoted text. Although the Preform grammar doesn't
go into this level of detail, it's actually required to have 3 to 23 English
letters or digits, with the first being a letter.
</p>
@ -209,23 +167,8 @@ letters or digits, with the first being a letter.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;external-file-sentence-object&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;quoted-text&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_FilenameNotTextual problem</span><span class="named-paragraph-number">8.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>&#167;8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_FilenameNotTextual problem</span><span class="named-paragraph-number">8.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_FilenameNotTextual problem</span><span class="named-paragraph-number">4.1</span></a></span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_FilenameNotTextual</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a file can only be called with a single quoted piece of text"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"as in: 'The File of Wisdom is called \"wisdom\".'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { -1, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>This handles the special meaning "File... is the file...".
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;new-file-sentence-object&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;indefinite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-file-sentence-object-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 2 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-file-sentence-object-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
@ -237,38 +180,46 @@ letters or digits, with the first being a letter.
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;external-file-sentence-subject&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Diagrams::new_UNPARSED_NOUN(W) }</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b></p>
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>&#167;4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_FilenameNotTextual problem</span><span class="named-paragraph-number">4.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::new_file_SMF</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::new_file_SMF</span></span>:<br/><a href="2-ef.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">[0]):</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">NPs</span><span class="plain-syntax">[1]):</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">task</span><span class="plain-syntax">) { </span><span class="comment-syntax"> "File... is the file..."</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ACCEPT_SMFT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;nounphrase-external-file&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="function-syntax">&lt;new-file-sentence-object&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">OW</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">O</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;np-unparsed&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">O</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PASS_1_SMFT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Files plugin inactive"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ef.html#SP10" class="function-link"><span class="function-syntax">ExternalFiles::register_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_FilenameNotTextual</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a file can only be called with a single quoted piece of text"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"as in: 'The File of Wisdom is called \"wisdom\".'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { -1, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>In assertion pass 1, then, the following is called on any sentence which
has been found to create a file:
</p>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::register_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">FN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bad_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::register_file</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::register_file</span></span>:<br/><a href="2-ef.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">FN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;external-file-sentence-object&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FN</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Vet the filename</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ownership</span><span class="plain-syntax"> = </span><span class="constant-syntax">OWNED_BY_THIS_PROJECT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Determine the ownership</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ef.html#SP9" class="function-link"><span class="function-syntax">ExternalFiles::files_create</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary</span><span class="plain-syntax">, </span><span class="identifier-syntax">ownership</span><span class="plain-syntax">, </span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">FN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MULTIMEDIA_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created external file &lt;%W&gt; = filename '%N'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">FN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>&#167;5.1. </b>The restrictions here are really very conservative.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Vet the filename</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bad_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wide::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) &lt; </span><span class="constant-syntax">5</span><span class="plain-syntax">) </span><span class="identifier-syntax">bad_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isalpha</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">[1]) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">bad_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">p</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
@ -291,13 +242,24 @@ letters or digits, with the first being a letter.
<span class="plain-syntax"> </span><span class="string-syntax">"automatically: this is invisible to Inform.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>&#167;5.2. </b>Each file can be text or binary, has a name, and can be owned by this project,
by an unspecified other project, or by a project identified by its IFID.
</p>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ownership</span><span class="plain-syntax"> = </span><span class="constant-syntax">OWNED_BY_THIS_PROJECT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">)</span>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_THIS_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_ANOTHER_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">OWNED_BY_SPECIFIC_PROJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
</pre>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Determine the ownership</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
</p>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;external-file-sentence-subject&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad ef grammar"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;external-file-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">;</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;external-file-sentence-subject&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad ef grammar"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;external-file-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ef.html#SP5_2_1" class="named-paragraph-link"><span class="named-paragraph">Make sure W can be the name of a new file anyway</span><span class="named-paragraph-number">5.2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;ownership&gt;&gt;</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;external-file-owner&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">, </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -310,152 +272,106 @@ letters or digits, with the first being a letter.
<span class="plain-syntax"> </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Objected to character %c\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">[</span><span class="identifier-syntax">j</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">invalid</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">j</span><span class="plain-syntax">==47)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">invalid</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">j</span><span class="plain-syntax">==47))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BadFileIFID</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the owner of the file should be specified "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"using a valid double-quoted IFID"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"as in: 'The File of Wisdom (owned by project "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"\"4122DDA8-A153-46BC-8F57-42220F9D8795\") "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is called \"wisdom\".'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ownership</span><span class="plain-syntax"> = </span><span class="constant-syntax">OWNED_BY_SPECIFIC_PROJECT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;ownership&gt;&gt;</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ownership</span><span class="plain-syntax"> = </span><span class="constant-syntax">OWNED_BY_ANOTHER_PROJECT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;ownership&gt;&gt;</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">ownership</span><span class="plain-syntax"> = </span><span class="constant-syntax">OWNED_BY_ANOTHER_PROJECT</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2_1" class="paragraph-anchor"></a><b>&#167;5.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make sure W can be the name of a new file anyway</span><span class="named-paragraph-number">5.2.1</span></span><span class="comment-syntax"> =</span>
</p>
<span class="plain-syntax"> </span><span class="identifier-syntax">Assertions::Creator::vet_name_for_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;s-value&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">)) &amp;&amp;</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Assertions::Creator::vet_name_for_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;s-value&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_FilenameDuplicate</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this is already the name of a file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so there must be some duplication somewhere."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ef.html#SP5_2">&#167;5.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. One significant kind. </b></p>
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Propositions::Abstract::to_create_something</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Assert::true</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PLUGIN_DATA_ON_INSTANCE</span><span class="plain-syntax">(</span><span class="identifier-syntax">files</span><span class="plain-syntax">, </span><span class="identifier-syntax">Instances::latest</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">F</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unextended_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_is_binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">binary</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_ownership</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ownership</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">IFID_of_owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">);</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::local_package</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTERNAL_FILES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">exf_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_with_memo</span><span class="plain-syntax">(</span><span class="identifier-syntax">FILE_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">IFID_array_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_with_memo</span><span class="plain-syntax">(</span><span class="identifier-syntax">IFID_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">FIGURE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created external file &lt;%W&gt; = filename '%N'\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unextended_filename</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">)</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::files_new_base_kind_notify</span></span>:<br/><a href="2-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"EXTERNAL_FILE_TY"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">new_base</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. I6 arrays of file structures. </b>External files are written in I6 as their array names:
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Significant new instances. </b>This structure of additional data is attached to each figure instance.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::arrays</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NO_EXTERNAL_FILES_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::named_numeric_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="reserved-syntax">external_file</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Hierarchy::make_available</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">, </span><span class="reserved-syntax">external_file</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_ownership</span><span class="plain-syntax"> == </span><span class="constant-syntax">OWNED_BY_SPECIFIC_PROJECT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Emit::named_string_array_begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">IFID_array_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">II</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">II</span><span class="plain-syntax">, </span><span class="string-syntax">"//%S</span><span class="comment-syntax">", exf-&gt;IFID_of_owner);</span>
<span class="string-syntax"> Emit::array_text_entry(II);</span>
<span class="string-syntax"> DISCARD_TEXT(II)</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> LOOP_OVER(exf, external_file) {</span>
<span class="string-syntax"> packaging_state save = Emit::named_array_begin(exf-&gt;exf_iname, K_value);</span>
<span class="string-syntax"> Emit::array_iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));</span>
<span class="string-syntax"> Emit::array_iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));</span>
<span class="string-syntax"> if (exf-&gt;file_is_binary) Emit::array_numeric_entry(1);</span>
<span class="string-syntax"> else Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> TEMPORARY_TEXT(WW)</span>
<span class="string-syntax"> WRITE_TO(WW, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">w</span><span class="string-syntax">", Lexer::word_raw_text(exf-&gt;unextended_filename));</span>
<span class="string-syntax"> Str::delete_first_character(WW);</span>
<span class="string-syntax"> Str::delete_last_character(WW);</span>
<span class="string-syntax"> Emit::array_text_entry(WW);</span>
<span class="string-syntax"> DISCARD_TEXT(WW)</span>
<span class="string-syntax"> switch (exf-&gt;file_ownership) {</span>
<span class="string-syntax"> case OWNED_BY_THIS_PROJECT: Emit::array_iname_entry(PL::Bibliographic::IFID::UUID()); break;</span>
<span class="string-syntax"> case OWNED_BY_ANOTHER_PROJECT: Emit::array_null_entry(); break;</span>
<span class="string-syntax"> case OWNED_BY_SPECIFIC_PROJECT: Emit::array_iname_entry(exf-&gt;IFID_array_iname); break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> iname = Hierarchy::find(TABLEOFEXTERNALFILES_HL);</span>
<span class="string-syntax"> packaging_state save = Emit::named_array_begin(iname, K_value);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> LOOP_OVER(exf, external_file) Emit::array_iname_entry(exf-&gt;exf_iname);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> Hierarchy::make_available(Emit::tree(), iname);</span>
<span class="string-syntax">}</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">files_data</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">unextended_filename</span><span class="plain-syntax">; </span><span class="comment-syntax"> word number of text like </span><span class="extract"><span class="extract-syntax">"bones"</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> an Inter identifier</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_is_binary</span><span class="plain-syntax">; </span><span class="comment-syntax"> true or false</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_ownership</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">OWNED_BY_*</span></span><span class="comment-syntax"> values above</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IFID_of_owner</span><span class="plain-syntax">; </span><span class="comment-syntax"> if we know that</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">external_file_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">files_data</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. External Files Index. </b>More or less perfunctory, but still of some use, if only as a list.
<ul class="endnotetexts"><li>The structure files_data is accessed in 2/fgr, 2/se and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>We allow instances of "external file" to be created only through the above
code calling <a href="2-fgr.html#SP9" class="internal">Figures::figures_create</a>. If any other proposition somehow
manages to make a figure, a problem message is thrown.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::index_all</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">external_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="reserved-syntax">external_file</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"This project doesn't read or write external files."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">ExternalFiles::files_create</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::files_create</span></span>:<br/><a href="2-ef.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">binary</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ownership</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">FN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Assert::true</span><span class="plain-syntax">(</span><span class="identifier-syntax">Propositions::Abstract::to_create_something</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::latest</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">files_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PLUGIN_DATA_ON_INSTANCE</span><span class="plain-syntax">(</span><span class="identifier-syntax">files</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unextended_filename</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_is_binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">binary</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_ownership</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ownership</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">IFID_of_owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">ifid_of_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTExternalFiles::new_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">ExternalFiles::files_new_named_instance_notify</span></span>:<br/><a href="2-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_external_file</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">allow_exf_creations</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BackdoorFileCreation</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this is not the way to create a new external file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which should be done with a special 'The File ... is called ...' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"sentence."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ATTACH_PLUGIN_DATA_TO_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">files</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_subject</span><span class="plain-syntax">, </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">files_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;b&gt;List of External Files&lt;/b&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::begin_html_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="string-syntax">"#ffffff"</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">, </span><span class="reserved-syntax">external_file</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::first_html_column</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">THUMBNAIL_WIDTH</span><span class="plain-syntax">+10);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_is_binary</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"img"</span><span class="plain-syntax">, </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/exf_binary.png\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"img"</span><span class="plain-syntax">, </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/exf_text.png\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&amp;nbsp;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::next_html_column</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::link</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG</span><span class="plain-syntax">(</span><span class="string-syntax">"br"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Filename: %s %N- owned by "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_is_binary</span><span class="plain-syntax">)?</span><span class="string-syntax">"- binary "</span><span class="plain-syntax">:</span><span class="string-syntax">""</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unextended_filename</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">file_ownership</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_THIS_PROJECT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"this project"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_ANOTHER_PROJECT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"another project"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OWNED_BY_SPECIFIC_PROJECT:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"project with IFID number &lt;b&gt;%S&lt;/b&gt;"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">IFID_of_owner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_row</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-se.html">&#10094;</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-fgr.html">fgr</a></li><li class="progresssection"><a href="2-se.html">se</a></li><li class="progresscurrent">ef</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-se.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-fgr.html">fgr</a></li><li class="progresssection"><a href="2-se.html">se</a></li><li class="progresscurrent">ef</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -79,7 +79,7 @@ function togglePopup(material_id) {
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Figures::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Figures::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Figures::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Figures::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">MAKE_SPECIAL_MEANINGS_PLUG</span><span class="plain-syntax">, </span><a href="2-fgr.html#SP2" class="function-link"><span class="function-syntax">Figures::make_special_meanings</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-fgr.html#SP7" class="function-link"><span class="function-syntax">Figures::figures_new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_INSTANCE_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-fgr.html#SP10" class="function-link"><span class="function-syntax">Figures::figures_new_named_instance_notify</span></a><span class="plain-syntax">);</span>
@ -124,10 +124,10 @@ function togglePopup(material_id) {
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-figure-sentence-object-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-function-syntax">&lt;new-figure-sentence-object-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">file</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;np-unparsed&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, RP[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">file</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;np-unparsed&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, RP[1] }</span>
<span class="Preform-function-syntax">&lt;nounphrase-figure&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">figure</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Diagrams::new_UNPARSED_NOUN(W) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">figure</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Diagrams::new_UNPARSED_NOUN(W) }</span>
<span class="Preform-function-syntax">&lt;figure-sentence-object&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;figure-source&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;quoted-text&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { R[1], -, &lt;&lt;alttext&gt;&gt; = R[2] }</span>
@ -181,7 +181,7 @@ has been found to create a figure:
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">figure_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Filenames::in</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::figures_path</span><span class="plain-syntax">(), </span><span class="identifier-syntax">leaf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-fgr.html#SP9" class="function-link"><span class="function-syntax">Figures::figures_create</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">figure_file</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;&lt;alttext&gt;&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">FIGURE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created figure &lt;%W&gt; = filename '%f' = resource ID %d\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MULTIMEDIA_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created figure &lt;%W&gt; = filename '%f' = resource ID %d\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">figure_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -358,7 +358,7 @@ the cover art, which is handled by Bibliographic Data.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="1-mm.html">&#10094;</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="2-se.html">se</a></li><li class="progresssection"><a href="2-ef.html">ef</a></li><li class="progressnext"><a href="2-se.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="1-mm.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="2-se.html">se</a></li><li class="progresssection"><a href="2-ef.html">ef</a></li><li class="progressnext"><a href="2-se.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -79,7 +79,7 @@ function togglePopup(material_id) {
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sounds::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Sounds::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sounds::start</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Sounds::start</span></span>:<br/>Multimedia Module - <a href="1-mm.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">MAKE_SPECIAL_MEANINGS_PLUG</span><span class="plain-syntax">, </span><a href="2-se.html#SP2" class="function-link"><span class="function-syntax">Sounds::make_special_meanings</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-se.html#SP7" class="function-link"><span class="function-syntax">Sounds::new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_INSTANCE_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-se.html#SP9" class="function-link"><span class="function-syntax">Sounds::new_named_instance_notify</span></a><span class="plain-syntax">);</span>
@ -173,7 +173,7 @@ has been found to create a sound:
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">leaf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sound_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Filenames::in</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::sounds_path</span><span class="plain-syntax">(), </span><span class="identifier-syntax">leaf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-se.html#SP9" class="function-link"><span class="function-syntax">Sounds::sounds_create</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">sound_file</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;&lt;alttext&gt;&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">FIGURE_CREATIONS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MULTIMEDIA_CREATIONS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Created sound effect &lt;%W&gt; = filename '%N' = resource ID %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">wn</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -316,7 +316,7 @@ created from <span class="extract"><span class="extract-syntax">Figures.w</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progresssection"><a href="2-ef.html">ef</a></li><li class="progressnext"><a href="2-ef.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progresssection"><a href="2-ef.html">ef</a></li><li class="progressnext"><a href="2-ef.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -0,0 +1,98 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>What This Module Does</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/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="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="index.html"><span class="selectedlink">multimedia</span></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>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</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="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'What This Module Does' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">multimedia</a></li><li><a href="index.html#P">Preliminaries</a></li><li><b>What This Module Does</b></li></ul></div>
<p class="purpose">An overview of the multimedia module's role and abilities.</p>
<ul class="toc"><li><a href="P-wtmd.html#SP1">&#167;1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">&#167;2. Now in glorious Technicolor</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Prerequisites. </b>The knowledge module is a part of the Inform compiler toolset. It is
presented as a literate program or "web". Before diving in:
</p>
<ul class="items"><li>(a) It helps to have some experience of reading webs: see <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for more.
</li><li>(b) The module is written in C, in fact ANSI C99, but this is disguised by the
fact that it uses some extension syntaxes provided by the <a href="../../../inweb/docs/index.html" class="internal">inweb</a> literate
programming tool, making it a dialect of C called InC. See <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for
full details, but essentially: it's C without predeclarations or header files,
and where functions have names like <span class="extract"><span class="extract-syntax">Tags::add_by_name</span></span> rather than just <span class="extract"><span class="extract-syntax">add_by_name</span></span>.
</li><li>(c) This module uses other modules drawn from the <a href="../compiler.html" class="internal">compiler</a>, and also
uses a module of utility functions called <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
For more, see <a href="../../../inweb/docs/foundation-module/P-abgtf.html" class="internal">A Brief Guide to Foundation (in foundation)</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Now in glorious Technicolor. </b>This module consists only of three independent plugins, and even those are
very similar to each other:
</p>
<ul class="items"><li>&#9679; <a href="2-ef.html" class="internal">External Files</a> is a plugin for reading and writing files;
</li><li>&#9679; <a href="2-fgr.html" class="internal">Figures</a> for displaying images; and
</li><li>&#9679; <a href="2-se.html" class="internal">Sound Effects</a> for playing music or other sounds.
</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">P</li><li class="progresscurrent">wtmd</li><li class="progresschapter"><a href="1-mm.html">1</a></li><li class="progresschapter"><a href="2-fgr.html">2</a></li><li class="progressnext"><a href="1-mm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -62,6 +62,17 @@
<hr>
<div class="contentspage">
<ul class="chapterlist">
<li>
<p class="chapterentry"><a name="P"></a>
<span class="chaptertitle">Preliminaries</span></p>
<ul class="sectionlist">
<li>
<p class="sectionentry"><a href="P-wtmd.html">
<spon class="sectiontitle">What This Module Does</span></a> -
<span class="sectionpurpose">An overview of the multimedia module's role and abilities.</span></p>
</li>
</ul>
</li>
<li>
<p class="chapterentry"><a name="1"></a>
<span class="chaptertitle">Chapter 1: Starting Up</span></p>
@ -76,7 +87,6 @@
<li>
<p class="chapterentry"><a name="2"></a>
<span class="chaptertitle">Chapter 2: Multimedia Features</span></p>
<p class="chapterpurpose">Three plugins enabling Inform-written works of IF to make use of multimedia features of the Glulx virtual machine.</p>
<ul class="sectionlist">
<li>
<p class="sectionentry"><a href="2-fgr.html">

File diff suppressed because one or more lines are too long

View file

@ -1723,11 +1723,11 @@ function togglePopup(material_id) {
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::find</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::find</span></span>:<br/>Emitting Inter - <a href="2-emt.html#SP2">&#167;2</a>, <a href="2-emt.html#SP3">&#167;3</a><br/>Fundamental Constants - <a href="4-fc.html#SP1">&#167;1</a>, <a href="4-fc.html#SP2">&#167;2</a><br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP9_1">&#167;9.1</a>, <a href="4-tl.html#SP13_1">&#167;13.1</a>, <a href="4-tl.html#SP14">&#167;14</a><br/>Text Substitutions - <a href="4-ts.html#SP7">&#167;7</a>, <a href="4-ts.html#SP7_1">&#167;7.1</a>, <a href="4-ts.html#SP11">&#167;11</a>, <a href="4-ts.html#SP11_1">&#167;11.1</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a>, <a href="4-rsp.html#SP6_3">&#167;6.3</a>, <a href="4-rsp.html#SP6_3_1_1">&#167;6.3.1.1</a><br/>Routines - <a href="4-rtn.html#SP4_1_2">&#167;4.1.2</a>, <a href="4-rtn.html#SP4_1_3">&#167;4.1.3</a>, <a href="4-rtn.html#SP4_1_4">&#167;4.1.4</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a>, <a href="4-itc.html#SP5">&#167;5</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1">&#167;1</a>, <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP2">&#167;2</a><br/>Temporary Variables - <a href="4-tv.html#SP3">&#167;3</a><br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a>, <a href="4-vrb.html#SP5">&#167;5</a>, <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Adjectives - <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP5">&#167;5</a>, <a href="4-rsfk.html#SP7">&#167;7</a>, <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP21_1">&#167;21.1</a>, <a href="4-rsfk.html#SP22">&#167;22</a>, <a href="4-rsfk.html#SP27">&#167;27</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_5_1">&#167;27.5.1</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a>, <a href="4-rsfk.html#SP31">&#167;31</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP3">&#167;3</a>, <a href="4-vart.html#SP4">&#167;4</a>, <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a>, <a href="4-rart.html#SP3">&#167;3</a>, <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP4_2_1">&#167;4.2.1</a>, <a href="4-rart.html#SP4_2_5_1">&#167;4.2.5.1</a>, <a href="4-rart.html#SP4_2_6">&#167;4.2.6</a>, <a href="4-rart.html#SP4_2_9">&#167;4.2.9</a>, <a href="4-rart.html#SP4_2_10">&#167;4.2.10</a>, <a href="4-rart.html#SP4_2_11">&#167;4.2.11</a>, <a href="4-rart.html#SP4_2_12">&#167;4.2.12</a>, <a href="4-rart.html#SP4_2_9_1">&#167;4.2.9.1</a>, <a href="4-rart.html#SP4_2_10_1">&#167;4.2.10.1</a>, <a href="4-rart.html#SP4_2_12_1">&#167;4.2.12.1</a>, <a href="4-rart.html#SP5">&#167;5</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP1">&#167;1</a>, <a href="4-lpart.html#SP1_1">&#167;1.1</a>, <a href="4-lpart.html#SP1_3_1">&#167;1.3.1</a>, <a href="4-lpart.html#SP1_3_1_1">&#167;1.3.1.1</a>, <a href="4-lpart.html#SP1_3_2">&#167;1.3.2</a>, <a href="4-lpart.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-lpart.html#SP1_2_2">&#167;1.2.2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP4_1_1_1_1_5">&#167;4.1.1.1.1.5</a>, <a href="4-rsft.html#SP4_2">&#167;4.2</a>, <a href="4-rsft.html#SP4_3">&#167;4.3</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Figures - <a href="5-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="5-se.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::find</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::find</span></span>:<br/>Emitting Inter - <a href="2-emt.html#SP2">&#167;2</a>, <a href="2-emt.html#SP3">&#167;3</a><br/>Fundamental Constants - <a href="4-fc.html#SP1">&#167;1</a>, <a href="4-fc.html#SP2">&#167;2</a><br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP9_1">&#167;9.1</a>, <a href="4-tl.html#SP13_1">&#167;13.1</a>, <a href="4-tl.html#SP14">&#167;14</a><br/>Text Substitutions - <a href="4-ts.html#SP7">&#167;7</a>, <a href="4-ts.html#SP7_1">&#167;7.1</a>, <a href="4-ts.html#SP11">&#167;11</a>, <a href="4-ts.html#SP11_1">&#167;11.1</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a>, <a href="4-rsp.html#SP6_3">&#167;6.3</a>, <a href="4-rsp.html#SP6_3_1_1">&#167;6.3.1.1</a><br/>Routines - <a href="4-rtn.html#SP4_1_2">&#167;4.1.2</a>, <a href="4-rtn.html#SP4_1_3">&#167;4.1.3</a>, <a href="4-rtn.html#SP4_1_4">&#167;4.1.4</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a>, <a href="4-itc.html#SP5">&#167;5</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1">&#167;1</a>, <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP2">&#167;2</a><br/>Temporary Variables - <a href="4-tv.html#SP3">&#167;3</a><br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a>, <a href="4-vrb.html#SP5">&#167;5</a>, <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Adjectives - <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP5">&#167;5</a>, <a href="4-rsfk.html#SP7">&#167;7</a>, <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP21_1">&#167;21.1</a>, <a href="4-rsfk.html#SP22">&#167;22</a>, <a href="4-rsfk.html#SP27">&#167;27</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_5_1">&#167;27.5.1</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a>, <a href="4-rsfk.html#SP31">&#167;31</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP3">&#167;3</a>, <a href="4-vart.html#SP4">&#167;4</a>, <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a>, <a href="4-rart.html#SP3">&#167;3</a>, <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP4_2_1">&#167;4.2.1</a>, <a href="4-rart.html#SP4_2_5_1">&#167;4.2.5.1</a>, <a href="4-rart.html#SP4_2_6">&#167;4.2.6</a>, <a href="4-rart.html#SP4_2_9">&#167;4.2.9</a>, <a href="4-rart.html#SP4_2_10">&#167;4.2.10</a>, <a href="4-rart.html#SP4_2_11">&#167;4.2.11</a>, <a href="4-rart.html#SP4_2_12">&#167;4.2.12</a>, <a href="4-rart.html#SP4_2_9_1">&#167;4.2.9.1</a>, <a href="4-rart.html#SP4_2_10_1">&#167;4.2.10.1</a>, <a href="4-rart.html#SP4_2_12_1">&#167;4.2.12.1</a>, <a href="4-rart.html#SP5">&#167;5</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP1">&#167;1</a>, <a href="4-lpart.html#SP1_1">&#167;1.1</a>, <a href="4-lpart.html#SP1_3_1">&#167;1.3.1</a>, <a href="4-lpart.html#SP1_3_1_1">&#167;1.3.1.1</a>, <a href="4-lpart.html#SP1_3_2">&#167;1.3.2</a>, <a href="4-lpart.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-lpart.html#SP1_2_2">&#167;1.2.2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP4_1_1_1_1_5">&#167;4.1.1.1.1.5</a>, <a href="4-rsft.html#SP4_2">&#167;4.2</a>, <a href="4-rsft.html#SP4_3">&#167;4.3</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Figures - <a href="5-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="5-se.html#SP1">&#167;1</a><br/>External Files - <a href="5-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HierarchyLocations::find</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Hierarchy::make_available</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::make_available</span></span>:<br/>Fundamental Constants - <a href="4-fc.html#SP1">&#167;1</a>, <a href="4-fc.html#SP2">&#167;2</a><br/>Responses - <a href="4-rsp.html#SP6_3">&#167;6.3</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP2">&#167;2</a><br/>Variables - <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Properties - <a href="4-prp.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27">&#167;27</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Noun Identifiers - <a href="4-ni.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a>, <a href="4-rart.html#SP3">&#167;3</a>, <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP6">&#167;6</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP4_2">&#167;4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Hierarchy::make_available</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::make_available</span></span>:<br/>Fundamental Constants - <a href="4-fc.html#SP1">&#167;1</a>, <a href="4-fc.html#SP2">&#167;2</a><br/>Responses - <a href="4-rsp.html#SP6_3">&#167;6.3</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP2">&#167;2</a><br/>Variables - <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Properties - <a href="4-prp.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27">&#167;27</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Noun Identifiers - <a href="4-ni.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a>, <a href="4-rart.html#SP3">&#167;3</a>, <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP6">&#167;6</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP4_2">&#167;4.2</a><br/>External Files - <a href="5-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ma_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::get_translation</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">ma_as</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">ma_as</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::to_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PackageTypes::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"_linkage"</span><span class="plain-syntax">);</span>
@ -1743,7 +1743,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HierarchyLocations::attach_new_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">hap_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::local_package</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::local_package</span></span>:<br/>List Together - <a href="4-lt.html#SP2">&#167;2</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP2">&#167;2</a><br/>Instances - <a href="4-ins.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">hap_id</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::local_package</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::local_package</span></span>:<br/>List Together - <a href="4-lt.html#SP2">&#167;2</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP2">&#167;2</a><br/>Instances - <a href="4-ins.html#SP1">&#167;1</a><br/>External Files - <a href="5-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">hap_id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HierarchyLocations::attach_new_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-cu.html#SP5" class="function-link"><span class="function-syntax">CompilationUnits::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">hap_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -1771,7 +1771,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HierarchyLocations::find_in_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::make_iname_with_memo</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::make_iname_with_memo</span></span>:<br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a><br/>Properties - <a href="4-prp.html#SP1">&#167;1</a>, <a href="4-prp.html#SP11">&#167;11</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP16_1_1">&#167;16.1.1</a><br/>Noun Identifiers - <a href="4-ni.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::make_iname_with_memo</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Hierarchy::make_iname_with_memo</span></span>:<br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a><br/>Properties - <a href="4-prp.html#SP1">&#167;1</a>, <a href="4-prp.html#SP11">&#167;11</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP16_1_1">&#167;16.1.1</a><br/>Noun Identifiers - <a href="4-ni.html#SP1">&#167;1</a><br/>External Files - <a href="5-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HierarchyLocations::find_in_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -0,0 +1,139 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>External Files</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/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="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="index.html"><span class="selectedlink">runtime</span></a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</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>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</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="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'External Files' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#5">Chapter 5: Plugin Support</a></li><li><b>External Files</b></li></ul></div>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>External files are written in Inter as their array names:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">external_file_compilation_data</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IFID_array_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">external_file_compilation_data</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">external_file_compilation_data</span><span class="plain-syntax"> </span><span class="function-syntax">RTExternalFiles::new_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">external_file_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">efcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::local_package</span></a><span class="plain-syntax">(</span><span class="constant-syntax">EXTERNAL_FILES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">efcd</span><span class="plain-syntax">.</span><span class="element-syntax">exf_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_with_memo</span></a><span class="plain-syntax">(</span><span class="constant-syntax">FILE_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">efcd</span><span class="plain-syntax">.</span><span class="element-syntax">IFID_array_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_with_memo</span></a><span class="plain-syntax">(</span><span class="constant-syntax">IFID_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">efcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTExternalFiles::arrays</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NO_EXTERNAL_FILES_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_numeric_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">files_data</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">files_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">exf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">, </span><span class="identifier-syntax">files_data</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">file_ownership</span><span class="plain-syntax"> == </span><span class="identifier-syntax">OWNED_BY_SPECIFIC_PROJECT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_string_array_begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">exf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">IFID_array_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">II</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">II</span><span class="plain-syntax">, </span><span class="string-syntax">"//%S</span><span class="comment-syntax">", exf-&gt;IFID_of_owner);</span>
<span class="string-syntax"> Emit::array_text_entry(II);</span>
<span class="string-syntax"> DISCARD_TEXT(II)</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> LOOP_OVER(exf, files_data) {</span>
<span class="string-syntax"> packaging_state save = Emit::named_array_begin(exf-&gt;compilation_data.exf_iname, K_value);</span>
<span class="string-syntax"> Emit::array_iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));</span>
<span class="string-syntax"> Emit::array_iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));</span>
<span class="string-syntax"> if (exf-&gt;file_is_binary) Emit::array_numeric_entry(1);</span>
<span class="string-syntax"> else Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> TEMPORARY_TEXT(WW)</span>
<span class="string-syntax"> WRITE_TO(WW, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">w</span><span class="string-syntax">", Lexer::word_raw_text(exf-&gt;unextended_filename));</span>
<span class="string-syntax"> Str::delete_first_character(WW);</span>
<span class="string-syntax"> Str::delete_last_character(WW);</span>
<span class="string-syntax"> Emit::array_text_entry(WW);</span>
<span class="string-syntax"> DISCARD_TEXT(WW)</span>
<span class="string-syntax"> switch (exf-&gt;file_ownership) {</span>
<span class="string-syntax"> case OWNED_BY_THIS_PROJECT: Emit::array_iname_entry(PL::Bibliographic::IFID::UUID()); break;</span>
<span class="string-syntax"> case OWNED_BY_ANOTHER_PROJECT: Emit::array_null_entry(); break;</span>
<span class="string-syntax"> case OWNED_BY_SPECIFIC_PROJECT: Emit::array_iname_entry(exf-&gt;compilation_data.IFID_array_iname); break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> iname = Hierarchy::find(TABLEOFEXTERNALFILES_HL);</span>
<span class="string-syntax"> packaging_state save = Emit::named_array_begin(iname, K_value);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> LOOP_OVER(exf, files_data) Emit::array_iname_entry(exf-&gt;compilation_data.exf_iname);</span>
<span class="string-syntax"> Emit::array_numeric_entry(0);</span>
<span class="string-syntax"> Emit::array_end(save);</span>
<span class="string-syntax"> Hierarchy::make_available(Emit::tree(), iname);</span>
<span class="string-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure external_file_compilation_data is private to this section.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-se.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresschapter"><a href="4-fc.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-fgr.html">fgr</a></li><li class="progresssection"><a href="5-se.html">se</a></li><li class="progresscurrent">ef</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -78,7 +78,7 @@
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-rsft.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresschapter"><a href="4-fc.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="5-se.html">se</a></li><li class="progressnext"><a href="5-se.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-rsft.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresschapter"><a href="4-fc.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="5-se.html">se</a></li><li class="progresssection"><a href="5-ef.html">ef</a></li><li class="progressnext"><a href="5-se.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -78,7 +78,7 @@
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresschapter"><a href="4-fc.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-fgr.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresschapter"><a href="4-fc.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-fgr.html">fgr</a></li><li class="progresscurrent">se</li><li class="progresssection"><a href="5-ef.html">ef</a></li><li class="progressnext"><a href="5-ef.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -309,6 +309,11 @@
<spon class="sectiontitle">Sound Effects</span></a> -
<span class="sectionpurpose"></span></p>
</li>
<li>
<p class="sectionentry"><a href="5-ef.html">
<spon class="sectiontitle">External Files</span></a> -
<span class="sectionpurpose"></span></p>
</li>
</ul>
</li>
</ul>

View file

@ -1,4 +1,4 @@
Total memory consumption was 260176K = 254 MB
Total memory consumption was 260177K = 254 MB
62.7% was used for 1338084 objects, in 278606 frames in 204 x 800K = 163200K = 159 MB:
@ -89,8 +89,8 @@ Total memory consumption was 260176K = 254 MB
---- action_name 90 objects, 18720 bytes
---- property 146 objects, 18688 bytes
---- parse_node_tree 20 objects, 17280 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- method 327 objects, 15696 bytes
---- to_phrase_request 59 objects, 15576 bytes
---- adjective 137 objects, 14248 bytes
@ -113,8 +113,8 @@ Total memory consumption was 260176K = 254 MB
---- parsing_pp_data 96 objects, 4608 bytes
---- build_vertex 40 objects, 4480 bytes
---- hierarchy_attachment_point 48 objects, 4224 bytes
---- placement_affecting_array 1 x 100 objects, 4032 bytes
---- stacked_variable_list_array 1 x 100 objects, 4032 bytes
---- placement_affecting_array 1 x 100 objects, 4032 bytes
---- activity 35 objects, 3920 bytes
---- inbuild_edition 54 objects, 3888 bytes
---- parse_node_annotation_type 118 objects, 3776 bytes
@ -127,8 +127,8 @@ Total memory consumption was 260176K = 254 MB
---- definition 44 objects, 3168 bytes
---- compatibility_specification 66 objects, 3168 bytes
---- inform_extension 19 objects, 3040 bytes
---- property_of_value_storage 93 objects, 2976 bytes
---- either_or_property_data 62 objects, 2976 bytes
---- property_of_value_storage 93 objects, 2976 bytes
---- submodule_request 72 objects, 2880 bytes
---- inter_construct 32 objects, 2560 bytes
---- part_of_inference_data 79 objects, 2528 bytes
@ -151,13 +151,13 @@ Total memory consumption was 260176K = 254 MB
---- constant_phrase 20 objects, 1280 bytes
---- build_script 40 objects, 1280 bytes
---- invocation_options_array 1 x 100 objects, 1224 bytes
---- direction_inference_data 30 objects, 1200 bytes
---- hierarchy_metadatum 15 objects, 1200 bytes
---- direction_inference_data 30 objects, 1200 bytes
---- quantifier 16 objects, 1024 bytes
---- table_column 16 objects, 896 bytes
---- inbuild_requirement 22 objects, 880 bytes
---- code_generation 1 object, 864 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- code_generation 1 object, 864 bytes
---- cached_understanding 21 objects, 840 bytes
---- runtime_kind_structure 13 objects, 832 bytes
---- phrase_option_array 1 x 100 objects, 824 bytes
@ -168,19 +168,19 @@ Total memory consumption was 260176K = 254 MB
---- submodule_identity 23 objects, 736 bytes
---- rulebook_outcome 17 objects, 680 bytes
---- inform_language 6 objects, 672 bytes
---- I6T_intervention 8 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- I6T_intervention 8 objects, 640 bytes
---- nascent_array 7 objects, 616 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- named_rulebook_outcome 15 objects, 600 bytes
---- label_namespace 10 objects, 560 bytes
---- small_word_set 11 objects, 528 bytes
---- implication 13 objects, 520 bytes
---- inform_kit 5 objects, 520 bytes
---- implication 13 objects, 520 bytes
---- inference_family 11 objects, 440 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- equation 4 objects, 416 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- module_package 10 objects, 400 bytes
---- dval_written 10 objects, 400 bytes
---- bp_family 12 objects, 384 bytes
@ -188,8 +188,8 @@ Total memory consumption was 260176K = 254 MB
---- source_file 5 objects, 360 bytes
---- inbuild_genre 7 objects, 336 bytes
---- pronoun 8 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- door_dir_notice 5 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- up_family 9 objects, 288 bytes
---- build_step 4 objects, 288 bytes
---- explicit_bp_data 5 objects, 280 bytes
@ -203,23 +203,23 @@ Total memory consumption was 260176K = 254 MB
---- kit_dependency 4 objects, 192 bytes
---- plural_dictionary_entry 4 objects, 192 bytes
---- inform_project 1 object, 176 bytes
---- link_instruction 4 objects, 160 bytes
---- code_generation_target 4 objects, 160 bytes
---- inference_subject_family 5 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- pointer_allocation 2 objects, 160 bytes
---- code_generation_target 4 objects, 160 bytes
---- link_instruction 4 objects, 160 bytes
---- element_activation 4 objects, 128 bytes
---- codegen_pipeline 1 object, 128 bytes
---- inbuild_nest 3 objects, 120 bytes
---- inform_kit_ittt 2 objects, 96 bytes
---- compile_task_data 1 object, 80 bytes
---- article 2 objects, 80 bytes
---- list_together_routine 2 objects, 80 bytes
---- inter_warehouse 1 object, 56 bytes
---- compile_task_data 1 object, 80 bytes
---- build_methodology 1 object, 56 bytes
---- star_invention 1 object, 48 bytes
---- figures_data 1 object, 48 bytes
---- inter_warehouse 1 object, 56 bytes
---- HTML_file_state 1 object, 48 bytes
---- figures_data 1 object, 48 bytes
---- star_invention 1 object, 48 bytes
---- parse_name_notice 1 object, 40 bytes
---- by_routine_bp_data 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
@ -227,7 +227,7 @@ Total memory consumption was 260176K = 254 MB
37.2% was used for memory not allocated for objects:
15.8% text stream storage 42246904 bytes in 265809 claims
15.8% text stream storage 42246912 bytes in 265809 claims
3.4% dictionary storage 9278976 bytes in 16372 claims
---- sorting 1064 bytes in 3 claims
2.7% source text 7200000 bytes in 3 claims

View file

@ -1,15 +1,15 @@
100.0% in inform7 run
66.4% in compilation to Inter
25.6% in //Phrases::Manager::compile_first_block//
8.0% in //Phrases::Manager::compile_as_needed//
6.9% in //Strings::compile_responses//
6.0% in //InferenceSubjects::emit_all//
66.9% in compilation to Inter
26.3% in //Phrases::Manager::compile_first_block//
7.8% in //Phrases::Manager::compile_as_needed//
6.7% in //Strings::compile_responses//
6.3% in //InferenceSubjects::emit_all//
4.1% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
2.0% in //Phrases::Manager::RulePrintingRule_routine//
2.0% in //Phrases::Manager::rulebooks_array//
1.9% in //Phrases::Manager::RulePrintingRule_routine//
1.8% in //Phrases::Manager::rulebooks_array//
1.0% in //RTVerbs::ConjugateVerb//
0.7% in //Phrases::Manager::traverse//
0.9% in //Phrases::Manager::traverse//
0.5% in //Phrases::Manager::parse_rule_parameters//
0.5% in //World::stage_V//
0.3% in //MajorNodes::pass_2//
@ -20,17 +20,18 @@
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
3.4% not specifically accounted for
31.1% in running Inter pipeline
9.8% in step preparation
9.6% in inter step 2/12: link
7.2% in inter step 12/12: generate inform6 -> auto.inf
30.6% in running Inter pipeline
10.8% in step preparation
9.8% in inter step 2/12: link
6.8% in inter step 12/12: generate inform6 -> auto.inf
0.3% in inter step 9/12: make-identifiers-unique
0.1% in inter step 10/12: reconcile-verbs
0.1% in inter step 11/12: eliminate-redundant-labels
0.1% in inter step 4/12: parse-linked-matter
0.1% in inter step 5/12: resolve-conditional-compilation
0.1% in inter step 6/12: assimilate
0.1% in inter step 7/12: resolve-external-symbols
0.1% in inter step 8/12: inspect-plugs
2.9% not specifically accounted for
2.0% in supervisor
1.4% not specifically accounted for
1.9% in supervisor
0.4% not specifically accounted for

View file

@ -207,7 +207,7 @@ DECLARE_CLASS(property_of_value_storage)
DECLARE_CLASS(runtime_kind_structure)
DECLARE_CLASS(test_scenario)
@ And finally //index// --
@ //index// --
@e contents_entry_CLASS
@e documentation_ref_CLASS
@ -221,3 +221,14 @@ DECLARE_CLASS(documentation_ref)
DECLARE_CLASS(index_element)
DECLARE_CLASS(index_page)
DECLARE_CLASS(index_lexicon_entry)
@ //multimedia// --
@e figures_data_CLASS
@e sounds_data_CLASS
@e files_data_CLASS
=
DECLARE_CLASS(figures_data)
DECLARE_CLASS(sounds_data)
DECLARE_CLASS(files_data)

View file

@ -221,7 +221,7 @@ so on. Those absolute basics are made here.
BENCH(Phrases::Manager::rulebooks_array)
BENCH_IF(scenes_plugin, PL::Scenes::DetectSceneChange_routine)
BENCH_IF(scenes_plugin, PL::Scenes::ShowSceneStatus_routine)
BENCH(ExternalFiles::arrays)
BENCH(RTExternalFiles::arrays)
BENCH(Rulebooks::rulebook_var_creators)
BENCH(Activities::activity_var_creators)
BENCH(RTRelations::IterateRelations)

View file

@ -589,7 +589,7 @@ void Index::index_actual_element(OUTPUT_STREAM, text_stream *elt) {
#ifdef MULTIMEDIA_MODULE
IXFigures::index_all(OUT);
IXSounds::index_all(OUT);
ExternalFiles::index_all(OUT);
IXExternalFiles::index_all(OUT);
#endif
return;
}

View file

@ -0,0 +1,48 @@
[IXExternalFiles::] External Files.
To produce the index of external files.
@ This is more or less perfunctory, but still of some use, if only as a list.
=
void IXExternalFiles::index_all(OUTPUT_STREAM) {
if (PluginManager::active(files_plugin) == FALSE) return;
files_data *exf;
if (NUMBER_CREATED(files_data) == 0) {
HTML_OPEN("p");
WRITE("This project doesn't read or write external files.");
HTML_CLOSE("p");
return;
}
HTML_OPEN("p");
WRITE("<b>List of External Files</b>");
HTML_CLOSE("p");
HTML::begin_html_table(OUT, "#ffffff", TRUE, 0, 0, 0, 0, 0);
LOOP_OVER(exf, files_data) {
HTML::first_html_column(OUT, THUMBNAIL_WIDTH+10);
if (exf->file_is_binary) {
HTML_TAG_WITH("img", "border=\"0\" src=\"inform:/doc_images/exf_binary.png\"");
} else {
HTML_TAG_WITH("img", "border=\"0\" src=\"inform:/doc_images/exf_text.png\"");
}
WRITE("&nbsp;");
HTML::next_html_column(OUT, 0);
WRITE("%+W", exf->name);
Index::link(OUT, Wordings::first_wn(exf->name));
HTML_TAG("br");
WRITE("Filename: %s %N- owned by ",
(exf->file_is_binary)?"- binary ":"",
exf->unextended_filename);
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT: WRITE("this project"); break;
case OWNED_BY_ANOTHER_PROJECT: WRITE("another project"); break;
case OWNED_BY_SPECIFIC_PROJECT:
WRITE("project with IFID number <b>%S</b>",
exf->IFID_of_owner);
break;
}
HTML::end_html_row(OUT);
}
HTML::end_html_table(OUT);
HTML_OPEN("p");
}

View file

@ -25,3 +25,4 @@ Chapter 2: Indexing
Chapter 3: Indexing for Plugins
Figures
Sound Effects
External Files

View file

@ -8,34 +8,27 @@ which use this module:
@d MULTIMEDIA_MODULE TRUE
@ This module defines the following classes:
@e figures_data_CLASS
@e sounds_data_CLASS
@e external_file_CLASS
=
DECLARE_CLASS(figures_data)
DECLARE_CLASS(sounds_data)
DECLARE_CLASS(external_file)
@
= (early code)
plugin *multimedia_plugin, *figures_plugin, *sounds_plugin, *files_plugin;
@ Like all modules, this one must define a |start| and |end| function:
@e FIGURE_CREATIONS_DA
@e MULTIMEDIA_CREATIONS_DA
=
void MultimediaModule::start(void) {
multimedia_plugin = PluginManager::new(NULL, I"multimedia", NULL);
figures_plugin = PluginManager::new(&Figures::start, I"figures", multimedia_plugin);
sounds_plugin = PluginManager::new(&Sounds::start, I"sounds", multimedia_plugin);
files_plugin = PluginManager::new(&ExternalFiles::start, I"glulx external files", multimedia_plugin);
figures_plugin = PluginManager::new(&Figures::start, I"figures",
multimedia_plugin);
sounds_plugin = PluginManager::new(&Sounds::start, I"sounds",
multimedia_plugin);
files_plugin = PluginManager::new(&ExternalFiles::start, I"glulx external files",
multimedia_plugin);
Log::declare_aspect(FIGURE_CREATIONS_DA, L"figure creations", FALSE, FALSE);
Log::declare_aspect(MULTIMEDIA_CREATIONS_DA, L"figure creations", FALSE, FALSE);
}
void MultimediaModule::end(void) {
}
@ Note that the "multimedia" plugin itself does nothihg except to be a parent
to the other three; it doesn't even have an activation function.
= (early code)
plugin *multimedia_plugin, *figures_plugin, *sounds_plugin, *files_plugin;

View file

@ -3,83 +3,49 @@
To register the names associated with external files, and build
the small I6 arrays associated with each.
@ The test group |:files| exercises the features below.
@ The test group |:files| exercises the features in this plugin.
@ Each file can be text or binary, has a name, and can be owned by a this
project, by an unspecified other project, or by a project named by IFID.
@d OWNED_BY_THIS_PROJECT 1
@d OWNED_BY_ANOTHER_PROJECT 2
@d OWNED_BY_SPECIFIC_PROJECT 3
@d files_data external_file
The following is called to activate the plugin:
=
typedef struct external_file {
struct wording name; /* text of name */
int unextended_filename; /* word number of text like |"bones"| */
struct text_stream *exf_I6_identifier; /* an I6 identifier */
int file_is_binary; /* true or false */
int file_ownership; /* one of the above */
struct text_stream *IFID_of_owner; /* an I6 identifier */
struct inter_name *exf_iname;
struct inter_name *IFID_array_iname;
CLASS_DEFINITION
} external_file;
@ A |-->| array to a run-time data structure associated
with an external file, read or written by the story file during play.
= (early code)
kind *K_external_file = NULL;
@ =
void ExternalFiles::start(void) {
PluginManager::plug(MAKE_SPECIAL_MEANINGS_PLUG, ExternalFiles::make_special_meanings);
PluginManager::plug(NEW_BASE_KIND_NOTIFY_PLUG, ExternalFiles::files_new_base_kind_notify);
PluginManager::plug(NEW_INSTANCE_NOTIFY_PLUG, ExternalFiles::files_new_named_instance_notify);
}
@ =
@h One special meaning.
We add one special meaning for assertions, to catch sentences with the shape:
>> The File of Wisdom (owned by another project) is called "wisdom".
=
int ExternalFiles::make_special_meanings(void) {
SpecialMeanings::declare(ExternalFiles::new_file_SMF, I"new-file", 2);
return FALSE;
}
int ExternalFiles::files_new_base_kind_notify(kind *new_base, text_stream *name, wording W) {
if (Str::eq_wide_string(name, L"EXTERNAL_FILE_TY")) {
K_external_file = new_base; return TRUE;
int ExternalFiles::new_file_SMF(int task, parse_node *V, wording *NPs) {
wording SW = (NPs)?(NPs[0]):EMPTY_WORDING;
wording OW = (NPs)?(NPs[1]):EMPTY_WORDING;
switch (task) { /* "File... is the file..." */
case ACCEPT_SMFT:
if ((<nounphrase-external-file>(SW)) && (<new-file-sentence-object>(OW))) {
parse_node *O = <<rp>>;
<np-unparsed>(SW);
V->next = <<rp>>;
V->next->next = O;
return TRUE;
}
break;
case PASS_1_SMFT:
ExternalFiles::register_file(Node::get_text(V->next),
Node::get_text(V->next->next));
break;
}
return FALSE;
}
int allow_exf_creations = FALSE;
int ExternalFiles::files_new_named_instance_notify(instance *nc) {
if (K_external_file == NULL) return FALSE;
kind *K = Instances::to_kind(nc);
if (Kinds::eq(K, K_external_file)) {
if (allow_exf_creations == FALSE)
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFileCreation),
"this is not the way to create a new external file",
"which should be done with a special 'The File ... is called ...' "
"sentence.");
ATTACH_PLUGIN_DATA_TO_SUBJECT(files, nc->as_subject, ExternalFiles::new_external_file(nc));
return TRUE;
}
return FALSE;
}
@ =
external_file *ExternalFiles::new_external_file(instance *nc) {
external_file *exf = CREATE(external_file);
return exf;
}
@ External files are created with a special sentence:
>> The File of Wisdom (owned by another project) is called "wisdom".
Here is the subject:
@ And this is the Preform grammar needed for the subject phrase:
=
<external-file-sentence-subject> ::=
@ -111,7 +77,7 @@ Here is the subject:
"is called \"wisdom\".'");
==> { NOT_APPLICABLE, - };
@ The object NP is simply quoted text. Although the Preform grammar doesn't
@ The object phrase is simply quoted text. Although the Preform grammar doesn't
go into this level of detail, it's actually required to have 3 to 23 English
letters or digits, with the first being a letter.
@ -120,15 +86,6 @@ letters or digits, with the first being a letter.
<quoted-text> | ==> { pass 1 }
... ==> @<Issue PM_FilenameNotTextual problem@>
@<Issue PM_FilenameNotTextual problem@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual),
"a file can only be called with a single quoted piece of text",
"as in: 'The File of Wisdom is called \"wisdom\".'");
==> { -1, - };
@ This handles the special meaning "File... is the file...".
=
<new-file-sentence-object> ::=
<indefinite-article> <new-file-sentence-object-unarticled> | ==> { pass 2 }
<new-file-sentence-object-unarticled> ==> { pass 1 }
@ -139,36 +96,37 @@ letters or digits, with the first being a letter.
<nounphrase-external-file> ::=
<external-file-sentence-subject> ==> { 0, Diagrams::new_UNPARSED_NOUN(W) }
@ =
int ExternalFiles::new_file_SMF(int task, parse_node *V, wording *NPs) {
wording SW = (NPs)?(NPs[0]):EMPTY_WORDING;
wording OW = (NPs)?(NPs[1]):EMPTY_WORDING;
switch (task) { /* "File... is the file..." */
case ACCEPT_SMFT:
if ((<nounphrase-external-file>(SW)) && (<new-file-sentence-object>(OW))) {
parse_node *O = <<rp>>;
<np-unparsed>(SW);
V->next = <<rp>>;
V->next->next = O;
return TRUE;
}
break;
case PASS_1_SMFT:
if (PluginManager::active(files_plugin) == FALSE)
internal_error("Files plugin inactive");
ExternalFiles::register_file(Node::get_text(V->next),
Node::get_text(V->next->next));
break;
}
return FALSE;
}
@<Issue PM_FilenameNotTextual problem@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual),
"a file can only be called with a single quoted piece of text",
"as in: 'The File of Wisdom is called \"wisdom\".'");
==> { -1, - };
void ExternalFiles::register_file(wording F, wording FN) {
int bad_filename = FALSE;
@ In assertion pass 1, then, the following is called on any sentence which
has been found to create a file:
=
void ExternalFiles::register_file(wording W, wording FN) {
<external-file-sentence-object>(FN);
FN = Wordings::from(FN, <<r>>);
if (Wordings::empty(FN)) return;
wchar_t *p = Lexer::word_text(Wordings::first_wn(FN));
@<Vet the filename@>;
int binary = FALSE;
int ownership = OWNED_BY_THIS_PROJECT;
TEMPORARY_TEXT(ifid_of_file)
@<Determine the ownership@>;
ExternalFiles::files_create(W, binary, ownership, ifid_of_file, FN);
LOGIF(MULTIMEDIA_CREATIONS, "Created external file <%W> = filename '%N'\n", W, FN);
DISCARD_TEXT(ifid_of_file)
}
@ The restrictions here are really very conservative.
@<Vet the filename@> =
int bad_filename = FALSE;
if (Wide::len(p) < 5) bad_filename = TRUE;
if (Characters::isalpha(p[1]) == FALSE) bad_filename = TRUE;
for (int i=0; p[i]; i++) {
@ -192,12 +150,18 @@ void ExternalFiles::register_file(wording F, wording FN) {
return;
}
int ownership = OWNED_BY_THIS_PROJECT;
TEMPORARY_TEXT(ifid_of_file)
@ Each file can be text or binary, has a name, and can be owned by this project,
by an unspecified other project, or by a project identified by its IFID.
if (<external-file-sentence-subject>(F) == FALSE) internal_error("bad ef grammar");
F = GET_RW(<external-file-name>, 1);
int binary = <<r>>;
@d OWNED_BY_THIS_PROJECT 1
@d OWNED_BY_ANOTHER_PROJECT 2
@d OWNED_BY_SPECIFIC_PROJECT 3
@<Determine the ownership@> =
if (<external-file-sentence-subject>(W) == FALSE) internal_error("bad ef grammar");
binary = <<r>>;
W = GET_RW(<external-file-name>, 1);
@<Make sure W can be the name of a new file anyway@>;
if (<<ownership>> == TRUE) {
wording OW = GET_RW(<external-file-owner>, 1);
int j, invalid = FALSE;
@ -210,23 +174,21 @@ void ExternalFiles::register_file(wording F, wording FN) {
invalid = TRUE;
LOG("Objected to character %c\n", p[j]);
}
if ((invalid) || (j==47)) {
if ((invalid) || (j==47))
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileIFID),
"the owner of the file should be specified "
"using a valid double-quoted IFID",
"as in: 'The File of Wisdom (owned by project "
"\"4122DDA8-A153-46BC-8F57-42220F9D8795\") "
"is called \"wisdom\".'");
} else
else
ownership = OWNED_BY_SPECIFIC_PROJECT;
}
if (<<ownership>> == FALSE) {
ownership = OWNED_BY_ANOTHER_PROJECT;
}
if (<<ownership>> == FALSE) ownership = OWNED_BY_ANOTHER_PROJECT;
Assertions::Creator::vet_name_for_noun(F);
if ((<s-value>(F)) &&
@<Make sure W can be the name of a new file anyway@> =
Assertions::Creator::vet_name_for_noun(W);
if ((<s-value>(W)) &&
(Rvalues::is_CONSTANT_of_kind(<<rp>>, K_external_file))) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameDuplicate),
"this is already the name of a file",
@ -234,122 +196,69 @@ void ExternalFiles::register_file(wording F, wording FN) {
return;
}
@h One significant kind.
= (early code)
kind *K_external_file = NULL;
@ =
int ExternalFiles::files_new_base_kind_notify(kind *new_base, text_stream *name, wording W) {
if (Str::eq_wide_string(name, L"EXTERNAL_FILE_TY")) {
K_external_file = new_base; return TRUE;
}
return FALSE;
}
@h Significant new instances.
This structure of additional data is attached to each figure instance.
=
typedef struct files_data {
struct wording name; /* text of name */
int unextended_filename; /* word number of text like |"bones"| */
struct text_stream *exf_identifier; /* an Inter identifier */
int file_is_binary; /* true or false */
int file_ownership; /* one of the |OWNED_BY_*| values above */
struct text_stream *IFID_of_owner; /* if we know that */
struct external_file_compilation_data compilation_data;
CLASS_DEFINITION
} files_data;
@ We allow instances of "external file" to be created only through the above
code calling //Figures::figures_create//. If any other proposition somehow
manages to make a figure, a problem message is thrown.
=
int allow_exf_creations = FALSE;
instance *ExternalFiles::files_create(wording W, int binary, int ownership,
text_stream *ifid_of_file, wording FN) {
allow_exf_creations = TRUE;
pcalc_prop *prop = Propositions::Abstract::to_create_something(
K_external_file, F);
Assert::true(prop, CERTAIN_CE);
Assert::true(Propositions::Abstract::to_create_something(K_external_file, W), CERTAIN_CE);
allow_exf_creations = FALSE;
external_file *exf = PLUGIN_DATA_ON_INSTANCE(files, Instances::latest());
exf->name = F;
exf->unextended_filename = Wordings::first_wn(FN);
exf->file_is_binary = binary;
exf->file_ownership = ownership;
exf->IFID_of_owner = Str::duplicate(ifid_of_file);
package_request *P = Hierarchy::local_package(EXTERNAL_FILES_HAP);
exf->exf_iname = Hierarchy::make_iname_with_memo(FILE_HL, P, exf->name);
exf->IFID_array_iname = Hierarchy::make_iname_with_memo(IFID_HL, P, exf->name);
LOGIF(FIGURE_CREATIONS, "Created external file <%W> = filename '%N'\n",
F, exf->unextended_filename);
DISCARD_TEXT(ifid_of_file)
instance *I = Instances::latest();
files_data *fd = PLUGIN_DATA_ON_INSTANCE(files, I);
fd->name = W;
fd->unextended_filename = Wordings::first_wn(FN);
fd->file_is_binary = binary;
fd->file_ownership = ownership;
fd->IFID_of_owner = Str::duplicate(ifid_of_file);
fd->compilation_data = RTExternalFiles::new_data(W);
return I;
}
@h I6 arrays of file structures.
External files are written in I6 as their array names:
=
void ExternalFiles::arrays(void) {
if (PluginManager::active(files_plugin) == FALSE) return;
inter_name *iname = Hierarchy::find(NO_EXTERNAL_FILES_HL);
Emit::named_numeric_constant(iname, (inter_ti) (NUMBER_CREATED(external_file)));
Hierarchy::make_available(Emit::tree(), iname);
external_file *exf;
LOOP_OVER(exf, external_file) {
if (exf->file_ownership == OWNED_BY_SPECIFIC_PROJECT) {
packaging_state save = Emit::named_string_array_begin(exf->IFID_array_iname, K_value);
TEMPORARY_TEXT(II)
WRITE_TO(II, "//%S//", exf->IFID_of_owner);
Emit::array_text_entry(II);
DISCARD_TEXT(II)
Emit::array_end(save);
}
int ExternalFiles::files_new_named_instance_notify(instance *I) {
if (K_external_file == NULL) return FALSE;
kind *K = Instances::to_kind(I);
if (Kinds::eq(K, K_external_file)) {
if (allow_exf_creations == FALSE)
StandardProblems::sentence_problem(Task::syntax_tree(),
_p_(PM_BackdoorFileCreation),
"this is not the way to create a new external file",
"which should be done with a special 'The File ... is called ...' "
"sentence.");
ATTACH_PLUGIN_DATA_TO_SUBJECT(files, I->as_subject, CREATE(files_data));
return TRUE;
}
LOOP_OVER(exf, external_file) {
packaging_state save = Emit::named_array_begin(exf->exf_iname, K_value);
Emit::array_iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));
Emit::array_iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));
if (exf->file_is_binary) Emit::array_numeric_entry(1);
else Emit::array_numeric_entry(0);
Emit::array_numeric_entry(0);
TEMPORARY_TEXT(WW)
WRITE_TO(WW, "%w", Lexer::word_raw_text(exf->unextended_filename));
Str::delete_first_character(WW);
Str::delete_last_character(WW);
Emit::array_text_entry(WW);
DISCARD_TEXT(WW)
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT: Emit::array_iname_entry(PL::Bibliographic::IFID::UUID()); break;
case OWNED_BY_ANOTHER_PROJECT: Emit::array_null_entry(); break;
case OWNED_BY_SPECIFIC_PROJECT: Emit::array_iname_entry(exf->IFID_array_iname); break;
}
Emit::array_end(save);
}
iname = Hierarchy::find(TABLEOFEXTERNALFILES_HL);
packaging_state save = Emit::named_array_begin(iname, K_value);
Emit::array_numeric_entry(0);
LOOP_OVER(exf, external_file) Emit::array_iname_entry(exf->exf_iname);
Emit::array_numeric_entry(0);
Emit::array_end(save);
Hierarchy::make_available(Emit::tree(), iname);
}
@h External Files Index.
More or less perfunctory, but still of some use, if only as a list.
=
void ExternalFiles::index_all(OUTPUT_STREAM) {
if (PluginManager::active(files_plugin) == FALSE) return;
external_file *exf;
if (NUMBER_CREATED(external_file) == 0) {
HTML_OPEN("p");
WRITE("This project doesn't read or write external files.");
HTML_CLOSE("p");
return;
}
HTML_OPEN("p");
WRITE("<b>List of External Files</b>");
HTML_CLOSE("p");
HTML::begin_html_table(OUT, "#ffffff", TRUE, 0, 0, 0, 0, 0);
LOOP_OVER(exf, external_file) {
HTML::first_html_column(OUT, THUMBNAIL_WIDTH+10);
if (exf->file_is_binary) {
HTML_TAG_WITH("img", "border=\"0\" src=\"inform:/doc_images/exf_binary.png\"");
} else {
HTML_TAG_WITH("img", "border=\"0\" src=\"inform:/doc_images/exf_text.png\"");
}
WRITE("&nbsp;");
HTML::next_html_column(OUT, 0);
WRITE("%+W", exf->name);
Index::link(OUT, Wordings::first_wn(exf->name));
HTML_TAG("br");
WRITE("Filename: %s %N- owned by ",
(exf->file_is_binary)?"- binary ":"",
exf->unextended_filename);
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT: WRITE("this project"); break;
case OWNED_BY_ANOTHER_PROJECT: WRITE("another project"); break;
case OWNED_BY_SPECIFIC_PROJECT:
WRITE("project with IFID number <b>%S</b>",
exf->IFID_of_owner);
break;
}
HTML::end_html_row(OUT);
}
HTML::end_html_table(OUT);
HTML_OPEN("p");
return FALSE;
}

View file

@ -50,10 +50,10 @@ int Figures::new_figure_SMF(int task, parse_node *V, wording *NPs) {
<new-figure-sentence-object-unarticled> ==> { pass 1 }
<new-figure-sentence-object-unarticled> ::=
file <np-unparsed> ==> { TRUE, RP[1] }
file <np-unparsed> ==> { TRUE, RP[1] }
<nounphrase-figure> ::=
figure ... ==> { 0, Diagrams::new_UNPARSED_NOUN(W) }
figure ... ==> { 0, Diagrams::new_UNPARSED_NOUN(W) }
<figure-sentence-object> ::=
<figure-source> ( <quoted-text> ) | ==> { R[1], -, <<alttext>> = R[2] }
@ -99,7 +99,7 @@ void Figures::register_figure(wording W, wording FN) {
filename *figure_file = NULL;
if (wn >= 0) Filenames::in(Task::figures_path(), leaf);
Figures::figures_create(W, id, figure_file, <<alttext>>);
LOGIF(FIGURE_CREATIONS, "Created figure <%W> = filename '%f' = resource ID %d\n",
LOGIF(MULTIMEDIA_CREATIONS, "Created figure <%W> = filename '%f' = resource ID %d\n",
W, figure_file, id);
}
}

View file

@ -91,7 +91,7 @@ void Sounds::register_sound(wording W, wording FN) {
DISCARD_TEXT(leaf)
filename *sound_file = Filenames::in(Task::sounds_path(), leaf);
Sounds::sounds_create(W, id, sound_file, <<alttext>>);
LOGIF(FIGURE_CREATIONS,
LOGIF(MULTIMEDIA_CREATIONS,
"Created sound effect <%W> = filename '%N' = resource ID %d\n", W, wn, id);
}
}

View file

@ -4,12 +4,13 @@ Purpose: A multimedia extension module for Inform.
Language: InC
Licence: Artistic License 2.0
Preliminaries
What This Module Does
Chapter 1: Starting Up
Multimedia Module
Chapter 2: Multimedia Features
"Three plugins enabling Inform-written works of IF to make use of multimedia
features of the Glulx virtual machine."
Figures
Sound Effects
External Files

View file

@ -0,0 +1,66 @@
[RTExternalFiles::] External Files.
@ External files are written in Inter as their array names:
=
typedef struct external_file_compilation_data {
struct inter_name *exf_iname;
struct inter_name *IFID_array_iname;
} external_file_compilation_data;
external_file_compilation_data RTExternalFiles::new_data(wording W) {
external_file_compilation_data efcd;
package_request *P = Hierarchy::local_package(EXTERNAL_FILES_HAP);
efcd.exf_iname = Hierarchy::make_iname_with_memo(FILE_HL, P, W);
efcd.IFID_array_iname = Hierarchy::make_iname_with_memo(IFID_HL, P, W);
return efcd;
}
void RTExternalFiles::arrays(void) {
if (PluginManager::active(files_plugin) == FALSE) return;
inter_name *iname = Hierarchy::find(NO_EXTERNAL_FILES_HL);
Emit::named_numeric_constant(iname, (inter_ti) (NUMBER_CREATED(files_data)));
Hierarchy::make_available(Emit::tree(), iname);
files_data *exf;
LOOP_OVER(exf, files_data) {
if (exf->file_ownership == OWNED_BY_SPECIFIC_PROJECT) {
packaging_state save = Emit::named_string_array_begin(exf->compilation_data.IFID_array_iname, K_value);
TEMPORARY_TEXT(II)
WRITE_TO(II, "//%S//", exf->IFID_of_owner);
Emit::array_text_entry(II);
DISCARD_TEXT(II)
Emit::array_end(save);
}
}
LOOP_OVER(exf, files_data) {
packaging_state save = Emit::named_array_begin(exf->compilation_data.exf_iname, K_value);
Emit::array_iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));
Emit::array_iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));
if (exf->file_is_binary) Emit::array_numeric_entry(1);
else Emit::array_numeric_entry(0);
Emit::array_numeric_entry(0);
TEMPORARY_TEXT(WW)
WRITE_TO(WW, "%w", Lexer::word_raw_text(exf->unextended_filename));
Str::delete_first_character(WW);
Str::delete_last_character(WW);
Emit::array_text_entry(WW);
DISCARD_TEXT(WW)
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT: Emit::array_iname_entry(PL::Bibliographic::IFID::UUID()); break;
case OWNED_BY_ANOTHER_PROJECT: Emit::array_null_entry(); break;
case OWNED_BY_SPECIFIC_PROJECT: Emit::array_iname_entry(exf->compilation_data.IFID_array_iname); break;
}
Emit::array_end(save);
}
iname = Hierarchy::find(TABLEOFEXTERNALFILES_HL);
packaging_state save = Emit::named_array_begin(iname, K_value);
Emit::array_numeric_entry(0);
LOOP_OVER(exf, files_data) Emit::array_iname_entry(exf->compilation_data.exf_iname);
Emit::array_numeric_entry(0);
Emit::array_end(save);
Hierarchy::make_available(Emit::tree(), iname);
}

View file

@ -61,3 +61,4 @@ Chapter 4: Compilation Utilities
Chapter 5: Plugin Support
Figures
Sound Effects
External Files