1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/1-wel.html
2019-07-20 12:40:27 +01:00

818 lines
84 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/pp</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '1/wel' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Where Everything Lives</b></li></ul><p class="purpose">To configure the many locations used in the host filing system.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Command line settings</a></li><li><a href="#SP6">&#167;6. Establishing the defaults</a></li><li><a href="#SP6_1">&#167;6.1. Internal resources</a></li><li><a href="#SP6_2">&#167;6.2. External resources</a></li><li><a href="#SP6_3">&#167;6.3. Project resources</a></li><li><a href="#SP6_4">&#167;6.4. Materials resources</a></li><li><a href="#SP7">&#167;7. EILTs</a></li><li><a href="#SP8">&#167;8. Location of extensions</a></li><li><a href="#SP10">&#167;10. Location of index files</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This section of the Inform source is intended to give a single description
of where everything lives in the filing system. Very early in Inform's run,
it works out the filenames of everything it will ever need to refer to, and
these are stored in the following globals. Explanations are given below,
not here. First, some "areas":
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_FS_AREAS</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">MATERIALS_FS_AREA</span><span class="plain"> 0 </span> <span class="comment">must match <code class="display"><span class="extract">ORIGIN_WAS_*</span></code> constants minus 1</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTERNAL_FS_AREA</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">INTERNAL_FS_AREA</span><span class="plain"> 2</span>
</pre>
<pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">AREA_NAME</span><span class="plain">[3] = { </span><span class="string">"from .materials"</span><span class="plain">, </span><span class="string">"installed"</span><span class="plain">, </span><span class="string">"built in"</span><span class="plain"> };</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Now for the folders:
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extensions</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_i6t_files</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_inter_resources</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_languages</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_website_templates</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extension_docs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_HTML_models</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_figures</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_release</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_sounds</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_figures</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_interpreter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_sounds</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And secondly, the files:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_blurb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_cblorb_report</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_cblorb_report_model</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_compiled_i6_code</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_debugging_log</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_default_inter_pipeline</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_documentation_snippets</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_epsfile</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_existing_story_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_extensions_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_headings</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_i7_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_ifiction_record</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_intro_booklet</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_intro_postcard</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_cover_art_png</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_default_cover_art</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_manifest</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_options</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_parse_tree</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_report</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_cover_art_png</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_default_cover_art</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_SR_module</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_story_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_telemetry</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_uuid</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Command line settings. </b>The following are called when the command line is parsed.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_project</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_project</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_internal</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_default_internal</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_external</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_transient</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_I7_source</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_i7_source</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_i7_source</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_SR_module</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_SR_module</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_SR_module</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::set_project is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_internal is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_default_internal is used in 1/mr (<a href="1-mr.html#SP4_4">&#167;4.4</a>).</p>
<p class="endnote">The function Locations::set_external is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_transient is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_I7_source is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_SR_module appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Establishing the defaults. </b>Inform's file access happens inside four different areas: the internal
resources area, usually inside the Inform application; the external resources
area, which is where the user (or the application acting on the user's behalf)
installs extensions; the project bundle, say <code class="display"><span class="extract">Example.inform</span></code>; and, alongside
that, the materials folder, <code class="display"><span class="extract">Example.materials</span></code>.
</p>
<p class="inwebparagraph">Inform can run in two modes: regular mode, when it's compiling source text,
and census mode, when it's scanning the file system for extensions.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_defaults</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">census_mode</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Internal resources</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">External resources</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Project resources</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Materials resources</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">filename_of_i7_source</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Except in census mode, source text must be supplied"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">census_mode</span><span class="plain">) &amp;&amp; (</span><span class="identifier">filename_of_i7_source</span><span class="plain">))</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"In census mode, no source text may be supplied"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::set_defaults is used in 1/mr (<a href="1-mr.html#SP4_5">&#167;4.5</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. Internal resources. </b>Inform needs a whole pile of files to have been installed on the host computer
before it can run: everything from the Standard Rules to a PDF file explaining
what interactive fiction is. They're never written to, only read. They are
referred to as "internal" or "built-in", and they occupy a folder called the
"internal resources" folder.
</p>
<p class="inwebparagraph">Unfortunately we don't know where it is. Typically this compiler will be an
executable sitting somewhere inside a user interface application, and the
internal resources folder will be somewhere else inside it. But we don't
know how to find that folder, and we don't want to make any assumptions.
Inform therefore requires on every run that it be told via the <code class="display"><span class="extract">-internal</span></code>
switch where the internal resources folder is.
</p>
<p class="inwebparagraph">The main ingredients here are the "EILT" resources: extensions, I6T files,
language definitions, and website templates. The Standard Rules, for
example, live inside the Extensions part of this.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Internal resources</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Did not set -internal when calling"</span><span class="plain">);</span>
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inter_resources</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inter"</span><span class="plain">);</span>
<span class="identifier">filename_of_default_inter_pipeline</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inter_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"default.interpipeline"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_1_1"></a><b>&#167;6.1.1. </b>Most of these files are to help Inblorb to perform a release. The
documentation models are used when making extension documentation; the
leafname is platform-dependent so that Windows can use different models
from everybody else.
</p>
<p class="inwebparagraph">The documentation snippets file is generated by <code class="display"><span class="extract">indoc</span></code> and contains
brief specifications of phrases, extracted from the manual "Writing with
Inform". This is used to generate the Phrasebook index.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">misc</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Miscellany"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_default_cover_art</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_default_cover_art</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Small Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_intro_postcard</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Postcard.pdf"</span><span class="plain">);</span>
<span class="identifier">filename_of_intro_booklet</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"IntroductionToIF.pdf"</span><span class="plain">);</span>
<span class="identifier">pathname_of_HTML_models</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"HTML"</span><span class="plain">);</span>
<span class="identifier">filename_of_cblorb_report_model</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"CblorbModel.html"</span><span class="plain">);</span>
<span class="identifier">filename_of_documentation_snippets</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"definitions.html"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_1">&#167;6.1</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. External resources. </b>This is where the user can install downloaded extensions, new interpreters,
website templates and so on; so-called "permanent" external resources, since
the user expects them to stay put once installed. But there is also a
"transient" external resources area, for more ephemeral content, such as
the mechanically generated extension documentation. On most platforms the
permanent and transient external areas will be the same, but some mobile
operating systems are aggressive about wanting to delete ephemeral files
used by applications.
</p>
<p class="inwebparagraph">The locations of the permanent and transient external folders can be set
using <code class="display"><span class="extract">-external</span></code> and <code class="display"><span class="extract">-transient</span></code> respectively. If no <code class="display"><span class="extract">-external</span></code> is
specified, the location depends on the platform settings: for example on
Mac OS X it will typically be
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">/Library/Users/hclinton/Library/Inform</span>
</pre>
<p class="inwebparagraph">If <code class="display"><span class="extract">-transient</span></code> is not specified, it's the same folder, i.e., Inform does
not distinguish between permanent and transient external resources.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">External resources</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">home_path</span><span class="plain">;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">subfolder_within</span><span class="plain"> = </span><span class="identifier">INFORM_FOLDER_RELATIVE_TO_HOME</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subfolder_within</span><span class="plain">[0]) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">subfolder_within</span><span class="plain">);</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">home_path</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inform"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">]) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> =</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_1"></a><b>&#167;6.2.1. </b>The permanent resources are read-only as far as we are concerned. (The
user interface application, and the user directly, write to this area when
they (say) install new extensions. But the compiler only reads.)
</p>
<p class="inwebparagraph">Once again we have a set of EILT resources, but we also have a curiosity:
a useful little file to add source text to everything Inform compiles,
generally to set use options.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">filename_of_options</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Options.txt"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2">&#167;6.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2"></a><b>&#167;6.2.2. </b>The transient resources are all written by us.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2">&#167;6.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2_1"></a><b>&#167;6.2.2.1. </b>The documentation folder is in effect a little website of its own, generated
automatically by Inform. There'll be some files at the top level, and then
there are files on each extension, in suitable subfolders. The census data
subfolder is not browsable or linked to, but holds working files needed when
assembling all this.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_extension_docs</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Documentation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">pathname_of_transient_census_data</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Census"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_extensions_dictionary</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Dictionary.txt"</span><span class="plain">);</span>
<span class="identifier">pathname_of_extension_docs_inner</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2_2">&#167;6.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2_2"></a><b>&#167;6.2.2.2. </b>Telemetry is not as sinister as it sounds: the app isn't sending data out
on the Internet, only (if requested) logging what it's doing to a local file.
This was provided for classroom use, so that teachers can see what their
students have been getting stuck on.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Telemetry"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_month</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain"> + 1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_day</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_year</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain"> + 1900;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">,</span>
<span class="string">"Telemetry %04d-%02d-%02d.txt"</span><span class="plain">, </span><span class="identifier">this_year</span><span class="plain">, </span><span class="identifier">this_month</span><span class="plain">, </span><span class="identifier">this_day</span><span class="plain">);</span>
<span class="identifier">filename_of_telemetry</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain">, </span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
<span class="identifier">Telemetry::locate_telemetry_file</span><span class="plain">(</span><span class="identifier">filename_of_telemetry</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2_2">&#167;6.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. Project resources. </b>Although on some platforms it may look like a single file, an Inform project
is a folder whose name has the dot-extension <code class="display"><span class="extract">.inform</span></code>. We'll call this the
"project folder", and it contains a whole bundle of useful files.
</p>
<p class="inwebparagraph">The UUID file records an ISBN-like identifying number for the project. This
is read-only for us.
</p>
<p class="inwebparagraph">The iFiction record, manifest and blurb file are all files that we generate
to give instructions to the releasing agent Inblorb. This means that they
have no purpose unless Inform is in a release run (with <code class="display"><span class="extract">-release</span></code> set on
the command line), but they take no time to generate so we make them anyway.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Project resources</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>&gt;<span class="plain">;</span>
<span class="identifier">filename_of_uuid</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"uuid.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_ifiction_record</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Metadata.iFiction"</span><span class="plain">);</span>
<span class="identifier">filename_of_manifest</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"manifest.plist"</span><span class="plain">);</span>
<span class="identifier">filename_of_blurb</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>&#167;6.3.1. </b>This contains just the main source text for the project. Anachronistically,
this has the filename extension <code class="display"><span class="extract">.ni</span></code> for "natural Inform", which was the
working title for Inform 7 back in the early 2000s.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_i7_source</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain">)</span>
<span class="identifier">filename_of_i7_source</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Source"</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"story.ni"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>&#167;6.3.2. </b>The build folder for a project contains all of the working files created
during the compilation process. The opening part here may be a surprise:
In extension census mode, Inform is running not to compile something but to
extract details of all the extensions installed. But it still needs somewhere
to write its temporary and debugging files, and there is no project bundle
to write into. To get round this, we use the census data area as if it
were indeed a project bundle.
</p>
<p class="inwebparagraph">Briefly: we aim to compile the source text to an Inform 6 program; we issue
an HTML report on our success or failure, listing problem messages if they
occurred; we track our progress in the debugging log. We don't produce the
story file ourselves, I6 will do that, but we do need to know what it's
called; and similarly for the report which the releasing tool Inblorb
will produce if this is a Release run.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build_folder</span><span class="plain"> = </span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">build_folder</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">filename_of_report</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Problems.html"</span><span class="plain">);</span>
<span class="identifier">filename_of_debugging_log</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Debug log.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_parse_tree</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Parse tree.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_compiled_i6_code</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">story_filename_extension</span><span class="plain">);</span>
<span class="identifier">filename_of_story_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">filename_of_cblorb_report</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StatusCblorb.html"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_3"></a><b>&#167;6.3.3. </b>We're going to write into the Index folder, so we must ensure it exists.
The main index files (<code class="display"><span class="extract">Phrasebook.html</span></code> and so on) live at the top level,
details on actions live in the subfolder <code class="display"><span class="extract">Details</span></code>: see below.
</p>
<p class="inwebparagraph">An oddity in the Index folder is an XML file recording where the headings
are in the source text: this is for the benefit of the user interface
application, if it wants it, but is not linked to or used by the HTML of
the index as seen by the user.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_project_index_folder</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Index"</span><span class="plain">);</span>
<span class="identifier">pathname_of_project_index_details_folder</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Details"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">) == 0) ||</span>
<span class="plain">(</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain">) == 0))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_headings</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Headings.xml"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. Materials resources. </b>The materials folder sits alongside the project folder and has the same name,
but ending <code class="display"><span class="extract">.materials</span></code> instead of <code class="display"><span class="extract">.inform</span></code>.
</p>
<p class="inwebparagraph">For the third and final time, there are EILT resources.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Materials resources</span> <span class="cwebmacronumber">6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">)-1;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">&gt;0) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) != </span><span class="character">'.'</span><span class="plain">)) </span><span class="identifier">i</span><span class="plain">--;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) {</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="string">".materials"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">] =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">-&gt;</span><span class="identifier">pathname_of_parent</span><span class="plain">, </span><span class="identifier">mf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">]) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform.materials"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">]);</span>
&lt;<span class="cwebmacro">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_1"></a><b>&#167;6.4.1. </b>This is where cover art lives: it could have either the file extension <code class="display"><span class="extract">.jpg</span></code>
or <code class="display"><span class="extract">.png</span></code>, and we generate both sets of filenames, even though at most one will
actually work. This is also where we generate the EPS file of the map, if
so requested; a bit anomalously, it's the only file in Materials but outside
Release which we write to.
</p>
<p class="inwebparagraph">This is also where the originals (not the released copies) of the Figures
and Sounds, if any, live: in their own subfolders.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_materials_figures</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">pathname_of_materials_sounds</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_cover_art_png</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Cover.png"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Small Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_cover_art_png</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Small Cover.png"</span><span class="plain">);</span>
<span class="identifier">filename_of_epsfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inform Map.eps"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_2"></a><b>&#167;6.4.2. </b>On a release run, Inblorb will populate the Release subfolder of Materials;
figures and sounds will be copied into the relevant subfolders. The principle
is that everything in Release can always be thrown away without loss, because
it can all be generated again.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_materials_release</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Release"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_interpreter</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"interpreter"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_figures</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_sounds</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_3"></a><b>&#167;6.4.3. </b>Inform is occasionally run in a mode where it performs a release on an
existing story file (for example a 1980s Infocom one) rather than on one
that it has newly generated. This is the filename such a story file would
have by default, if so.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"story.%S"</span><span class="plain">, </span><span class="identifier">story_filename_extension</span><span class="plain">);</span>
<span class="identifier">filename_of_existing_story_file</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. EILTs. </b>Each of the materials folder, the internal and external areas has a suite
of subfolders to hold I7 extensions (in an author tree: see below), I6
template files, language definitions and website templates.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">pathname_of_extensions</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions"</span><span class="plain">);</span>
<span class="identifier">pathname_of_i6t_files</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"I6T"</span><span class="plain">);</span>
<span class="identifier">pathname_of_languages</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Languages"</span><span class="plain">);</span>
<span class="identifier">pathname_of_website_templates</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Templates"</span><span class="plain">);</span>
<span class="identifier">pathname_of_inter_resources</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Inter"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::EILT_at is used in <a href="#SP6_1">&#167;6.1</a>, <a href="#SP6_2_1">&#167;6.2.1</a>, <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Location of extensions. </b>When Inform needs one of the EILT resources, it now has three places to look:
the internal resources folder, the external one, and the materials folder.
In fact, it checks them in reverse order, thus allowing the user to override
default resources.
</p>
<p class="inwebparagraph">To take the E part, within an Extensions folder, the extensions are stored
within subfolders named for their authors:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Extensions</span>
<span class="plain"> Emily Short</span>
<span class="plain"> Locksmith.i7x</span>
</pre>
<p class="inwebparagraph">This is now very much deprecated, but at one time the filename extension
<code class="display"><span class="extract">.i7x</span></code> was optional.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::of_extension</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">author</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i7x_flag</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i7x_flag</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.i7x"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">author</span><span class="plain">), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::of_extension is used in 3/rst (<a href="3-rst.html#SP6_1">&#167;6.1</a>), 8/ec (<a href="8-ec.html#SP5_2_2_1">&#167;5.2.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Documentation is similarly arranged:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::of_extension_documentation</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">author</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.html"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain">, </span><span class="identifier">author</span><span class="plain">), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::of_extension_documentation is used in 8/ed2 (<a href="8-ed2.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Location of index files. </b>Filenames within the <code class="display"><span class="extract">Index</span></code> subfolder. Filenames in <code class="display"><span class="extract">Details</span></code> have the form
<code class="display"><span class="extract">N_S</span></code> where <code class="display"><span class="extract">N</span></code> is the integer supplied and <code class="display"><span class="extract">S</span></code> the leafname; for instance,
<code class="display"><span class="extract">21_A.html</span></code> provides details page number 21 about actions, derived from the
leafname <code class="display"><span class="extract">A.html</span></code>.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::in_index</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sub</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sub</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">, </span><span class="string">"%d_%S"</span><span class="plain">, </span><span class="identifier">sub</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain">, </span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::in_index appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-pp.html">Back to 'Progress Percentages'</a></li><li><i>(This section ends Chapter 1: Configuration and Control.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>