1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-09 02:24:21 +03:00
inform7/docs/core-module/1-wtc.html

594 lines
94 KiB
HTML
Raw Normal View History

2020-02-27 03:43:11 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-02-27 13:18:25 +02:00
<title>1/mr</title>
2020-02-27 03:43:11 +02:00
<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/wtc' 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>What To Compile</b></li></ul><p class="purpose">To receive an instruction to compile something from Inbuild, and then to sort out the many locations then used in the host filing system.</p>
2020-03-11 02:21:09 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Task data</a></li><li><a href="#SP9">&#167;9. Project-related files and file paths</a></li></ul><hr class="tocbar">
2020-02-27 03:43:11 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Task data. </b>When Inbuild (a copy of which is included in the Inform 7 executable) decides
that an Inform source text must be compiled, it calls <code class="display"><span class="extract">Task::carry_out</span></code>. By
this point Inbuild will have set up an <code class="display"><span class="extract">inform_project</span></code> structure to
represent the program we have to compile; but we will need additional data
about that compilation, and it's stored in the following.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">compile_task_data</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">build_step</span><span class="plain"> *</span><span class="identifier">task</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">materials</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">existing_storyfile</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage_of_compilation</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_resource_number</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">compile_task_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure compile_task_data is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>An early and perhaps arguable design decision for inform7 was that it would
compile just one source text in its lifetime as a process: and because of that,
<code class="display"><span class="extract">Task::carry_out</span></code> can only in fact be called once, and Inbuild only does so
once. But the following routine allows in principle for multiple calls,
against the day when we change our minds about all this.
</p>
<p class="inwebparagraph">Something we will never do is attempt to make <code class="display"><span class="extract">inform7</span></code> thread-safe in the
sense of being able to compile two source texts simultaneously. The global
<code class="display"><span class="extract">inform7_task</span></code> is null when nothing is being compiled, or set to the unique
thing which is being compiled when it is.
</p>
<pre class="display">
<span class="reserved">compile_task_data</span><span class="plain"> *</span><span class="identifier">inform7_task</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">latest_syntax_tree</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::carry_out</span><span class="plain">(</span><span class="identifier">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">project</span><span class="plain"> = </span><span class="identifier">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no project"</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">latest_syntax_tree</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-&gt;</span><span class="identifier">syntax_tree</span><span class="plain">;</span>
<span class="functiontext">Task::issue_problems_arising</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">vertex</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"cannot re-enter with new task"</span><span class="plain">);</span>
<span class="identifier">inform7_task</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">compile_task_data</span><span class="plain">);</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;task</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">associated_copy</span><span class="plain">-&gt;</span><span class="identifier">location_if_path</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain"> = </span><span class="identifier">Projects::build_pathname</span><span class="plain">(</span><span class="identifier">project</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain"> = </span><span class="identifier">Inbuild::materials</span><span class="plain">();</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> = -1;</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;next_resource_number</span><span class="plain"> = 3;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">English_language</span><span class="plain"> = </span><span class="identifier">Projects::get_language_of_syntax</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
2020-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">Sequence::carry_out</span><span class="plain">(</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;task</span><span class="plain">-&gt;</span><span class="identifier">for_vm</span><span class="plain">));</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform7_task</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">rv</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::carry_out appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>All manner of low-level problems emerge when reading in the text of the
project, or any extensions it uses: these have already been found by inbuild
and are attached to the relevant nodes in the build graph. We issue them
here as Inform problem messages. (Inbuild wasn't able to do that for us
because the Inform problems file wasn't open back then; and besides, it can
only issue stubby Unix-like command line errors.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::issue_problems_arising</span><span class="plain">(</span><span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">type</span><span class="plain"> == </span><span class="identifier">COPY_VERTEX</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Issue from copy of %X at %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">);</span>
<span class="functiontext">SourceProblems::issue_problems_arising</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">build_edges</span><span class="plain">)</span>
<span class="functiontext">Task::issue_problems_arising</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">use_edges</span><span class="plain">)</span>
<span class="functiontext">Task::issue_problems_arising</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::issue_problems_arising is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We will keep track of how far along the process has advanced, in very
2020-02-27 13:18:25 +02:00
rough stages. Twenty is plenty.
2020-02-27 03:43:11 +02:00
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::advance_stage_to</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">) {</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> &lt;= </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"not an advance"</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> &gt;= 20) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"went too far"</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">roman</span><span class="plain">[] = {</span>
<span class="string">"I"</span><span class="plain">, </span><span class="string">"II"</span><span class="plain">, </span><span class="string">"III"</span><span class="plain">, </span><span class="string">"IV"</span><span class="plain">, </span><span class="string">"V"</span><span class="plain">, </span><span class="string">"VI"</span><span class="plain">, </span><span class="string">"VII"</span><span class="plain">, </span><span class="string">"VIII"</span><span class="plain">, </span><span class="string">"IX"</span><span class="plain">, </span><span class="string">"X"</span><span class="plain">,</span>
<span class="string">"XI"</span><span class="plain">, </span><span class="string">"XII"</span><span class="plain">, </span><span class="string">"XIII"</span><span class="plain">, </span><span class="string">"XIV"</span><span class="plain">, </span><span class="string">"XV"</span><span class="plain">, </span><span class="string">"XVI"</span><span class="plain">, </span><span class="string">"XVII"</span><span class="plain">, </span><span class="string">"XVIII"</span><span class="plain">, </span><span class="string">"XIX"</span><span class="plain">, </span><span class="string">"XX"</span><span class="plain"> };</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) {</span>
<span class="identifier">Log::new_phase</span><span class="plain">(</span><span class="identifier">roman</span><span class="plain">[</span><span class="identifier">stage</span><span class="plain">], </span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> &gt;= 0) </span><span class="functiontext">ProgressBar::update</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">, 0);</span>
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> = </span><span class="identifier">stage</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_before_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> &lt; </span><span class="identifier">stage</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="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_during_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> == </span><span class="identifier">stage</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="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::is_after_stage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;stage_of_compilation</span><span class="plain"> &gt; </span><span class="identifier">stage</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="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::advance_stage_to is used in 1/htc (<a href="1-htc.html#SP2">&#167;2</a>, <a href="1-htc.html#SP2_3">&#167;2.3</a>, <a href="1-htc.html#SP2_4">&#167;2.4</a>, <a href="1-htc.html#SP2_5">&#167;2.5</a>, <a href="1-htc.html#SP2_6">&#167;2.6</a>, <a href="1-htc.html#SP2_7">&#167;2.7</a>, <a href="1-htc.html#SP2_8">&#167;2.8</a>, <a href="1-htc.html#SP2_9">&#167;2.9</a>).</p>
2020-02-27 03:43:11 +02:00
<p class="endnote">The function Task::is_before_stage appears nowhere else.</p>
<p class="endnote">The function Task::is_during_stage is used in 16/in (<a href="16-in.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Task::is_after_stage appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The current project and the virtual machine we want to compile it for:
2020-02-27 03:43:11 +02:00
</p>
<pre class="display">
<span class="identifier">inform_project</span><span class="plain"> *</span><span class="functiontext">Task::project</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">target_vm</span><span class="plain"> *</span><span class="functiontext">Task::vm</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;task</span><span class="plain">-&gt;</span><span class="identifier">for_vm</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">inbuild_edition</span><span class="plain"> *</span><span class="functiontext">Task::edition</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">latest_syntax_tree</span><span class="plain">;</span>
<span class="plain">}</span>
2020-02-27 03:43:11 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::project is used in 3/nl (<a href="3-nl.html#SP2">&#167;2</a>), 4/am (<a href="4-am.html#SP42">&#167;42</a>, <a href="4-am.html#SP43">&#167;43</a>), 5/ins (<a href="5-ins.html#SP14">&#167;14</a>, <a href="5-ins.html#SP25">&#167;25</a>, <a href="5-ins.html#SP26">&#167;26</a>), 5/ipw (<a href="5-ipw.html#SP3_3_1">&#167;3.3.1</a>, <a href="5-ipw.html#SP3_3_1_1">&#167;3.3.1.1</a>), 6/nv (<a href="6-nv.html#SP22">&#167;22</a>), 26/ts (<a href="26-ts.html#SP11">&#167;11</a>).</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::vm is used in <a href="#SP16">&#167;16</a>, 5/lp (<a href="5-lp.html#SP12_2">&#167;12.2</a>, <a href="5-lp.html#SP18_3">&#167;18.3</a>), 6/rlt (<a href="6-rlt.html#SP14">&#167;14</a>), 13/rsfk (<a href="13-rsfk.html#SP18_1">&#167;18.1</a>, <a href="13-rsfk.html#SP20">&#167;20</a>, <a href="13-rsfk.html#SP26">&#167;26</a>), 17/ts (<a href="17-ts.html#SP11_1">&#167;11.1</a>), 25/cii (<a href="25-cii.html#SP3_5_8_3">&#167;3.5.8.3</a>), 26/fc (<a href="26-fc.html#SP3">&#167;3</a>), 26/uo (<a href="26-uo.html#SP18">&#167;18</a>), 26/rt (<a href="26-rt.html#SP4">&#167;4</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>).</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::edition appears nowhere else.</p>
<p class="endnote">The function Task::syntax_tree is used in 1/mr (<a href="1-mr.html#SP1">&#167;1</a>), 2/up (<a href="2-up.html#SP2">&#167;2</a>, <a href="2-up.html#SP2_3">&#167;2.3</a>), 2/si (<a href="2-si.html#SP1">&#167;1</a>, <a href="2-si.html#SP2">&#167;2</a>, <a href="2-si.html#SP3">&#167;3</a>, <a href="2-si.html#SP4">&#167;4</a>, <a href="2-si.html#SP5">&#167;5</a>, <a href="2-si.html#SP6">&#167;6</a>, <a href="2-si.html#SP7">&#167;7</a>, <a href="2-si.html#SP8">&#167;8</a>, <a href="2-si.html#SP9">&#167;9</a>, <a href="2-si.html#SP10">&#167;10</a>, <a href="2-si.html#SP11">&#167;11</a>, <a href="2-si.html#SP12">&#167;12</a>, <a href="2-si.html#SP13">&#167;13</a>), 2/pwst (<a href="2-pwst.html#SP1">&#167;1</a>), 3/nl (<a href="3-nl.html#SP8">&#167;8</a>), 3/pd (<a href="3-pd.html#SP2_1">&#167;2.1</a>), 4/am (<a href="4-am.html#SP11_1">&#167;11.1</a>, <a href="4-am.html#SP25_1">&#167;25.1</a>, <a href="4-am.html#SP25_2">&#167;25.2</a>, <a href="4-am.html#SP25_3">&#167;25.3</a>, <a href="4-am.html#SP25_4">&#167;25.4</a>, <a href="4-am.html#SP25_5">&#167;25.5</a>, <a href="4-am.html#SP26_1">&#167;26.1</a>), 5/lp (<a href="5-lp.html#SP12_2">&#167;12.2</a>, <a href="5-lp.html#SP18_2">&#167;18.2</a>, <a href="5-lp.html#SP18_3">&#167;18.3</a>, <a href="5-lp.html#SP18_4">&#167;18.4</a>, <a href="5-lp.html#SP18_1_4">&#167;18.1.4</a>, <a href="5-lp.html#SP35_2">&#167;35.2</a>, <a href="5-lp.html#SP35_3">&#167;35.3</a>, <a href="5-lp.html#SP36_1">&#167;36.1</a>, <a href="5-lp.html#SP37_1">&#167;37.1</a>, <a href="5-lp.html#SP34_4">&#167;34.4</a>, <a href="5-lp.html#SP34_5">&#167;34.5</a>, <a href="5-lp.html#SP34_6">&#167;34.6</a>, <a href="5-lp.html#SP34_8">&#167;34.8</a>, <a href="5-lp.html#SP34_9">&#167;34.9</a>, <a href="5-lp.html#SP34_10">&#167;34.10</a>, <a href="5-lp.html#SP34_10_1">&#167;34.10.1</a>, <a href="5-lp.html#SP34_10_2">&#167;34.10.2</a>, <a href="5-lp.html#SP34_11">&#167;34.11</a>, <a href="5-lp.html#SP34_13">&#167;34.13</a>, <a href="5-lp.html#SP34_14">&#167;34.14</a>, <a href="5-lp.html#SP40_1">&#167;40.1</a>, <a href="5-lp.html#SP41_1">&#167;41.1</a>, <a href="5-lp.html#SP41_2">&#167;41.2</a>, <a href="5-lp.html#SP41_1_1">&#167;41.1.1</a>), 5/tod (<a href="5-tod.html#SP9_1">&#167;9.1</a>, <a href="5-tod.html#SP9_2">&#167;9.2</a>), 5/uem (<a href="5-uem.html#SP7">&#167;7</a>), 5/ut (<a href="5-ut.html#SP1">&#167;1</a>, <a href="5-ut.html#SP3_1">&#167;3.1</a>, <a href="5-ut.html#SP5">&#167;5</a>), 5/un (<a href="5-un.html#SP2">&#167;2</a>, <a href="5-un.html#SP2_1">&#167;2.1</a>, <a href="5-un.html#SP5">&#167;5</a>), 5/ins (<a href="5-ins.html#SP6_4">&#167;6.4</a>, <a href="5-ins.html#SP19_1">&#167;19.1</a>), 5/nv (<a href="5-nv.html#SP7_1">&#167;7.1</a>, <a href="5-nv.html#SP10">&#167;10</a>, <a href="5-nv.html#SP12_1">&#167;12.1</a>, <a href="5-nv.html#SP14">&#167;14</a>, <a href="5-nv.html#SP16_1_1">&#167;16.1.1</a>, <a href="5-nv.html#SP22">&#167;22</a>, <a href="5-nv.html#SP23">&#167;23</a>, <a href="5-nv.html#SP25_1">&#167;25.1</a>, <a href="5-nv.html#SP25_2">&#167;25.2</a>), 6/rlt (<a href="6-rlt.html#SP7_1">&#167;7.1</a>, <a href="6-rlt.html#SP9">&#167;9</a>, <a href="6-rlt.html#SP9_3_2">&#167;9.3.2</a>, <a href="6-rlt.html#SP9_3_3">&#167;9.3.3</a>, <a href="6-rlt.html#SP9_3_5">&#167;9.3.5</a>, <a href="6-rlt.html#SP9_3_6">&#167;9.3.6</a>, <a href="6-rlt.html#SP9_4">&#167;9.4</a>, <a href="6-rlt.html#SP11">&#167;11</a>, <a href="6-rlt.html#SP12">&#167;12</a>, <a href="6-rlt.html#SP30">&#167;30</a>), 6/er (<a href="6-er.html#SP3_1">&#167;3.1</a>, <a href="6-er.html#SP3_2">&#167;3.2</a>), 6/nv (<a href="6-nv.html#SP9_1">&#167;9.1</a>, <a href="6-nv.html#SP9_2">&#167;9.2</a>, <a href="6-nv.html#SP9_3">&#167;9.3</a>, <a href="6-nv.html#SP9_4">&#167;9.4</a>, <a href="6-nv.html#SP14">&#167;14</a>, <a href="6-nv.html#SP14_1">&#167;14.1</a>, <a href="6-nv.html#SP14_5_1_1_1">&#167;14.5.1.1.1</a>, <a href="6-nv.html#SP14_5_1_2">&#167;14.5.1.2</a>, <a href="6-nv.html#SP14_5_1_3">&#167;14.5.1.3</a>, <a href="6-nv.html#SP14_6">&#167;14.6</a>), 7/ptu (<a href="7-ptu.html#SP18">&#167;18</a>), 7/ns (<a href=
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Resources in a Blorb file have unique ID numbers which are positive integers,
2020-02-27 03:43:11 +02:00
but these are not required to start from 1, nor to be contiguous. For Inform,
ID number 1 is reserved for the cover image (whether or not any cover image
is provided: it is legal for there to be figures but no cover, and vice versa).
Other figures, and sound effects, then mix freely as needed from ID number 3
on upwards. We skip 2 so that it can be guaranteed that no sound resource
has ID 1 or 2: this is to help people trying to play sounds in the Z-machine,
where operand 1 or 2 in the <code class="display"><span class="extract">@sound</span></code> opcode signifies not a sound resource
number but a long or short beep. If a genuine sound effect had resource ID
1 or 2, therefore, it would be unplayable on the Z-machine.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::get_next_free_blorb_resource_ID</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;next_resource_number</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::get_next_free_blorb_resource_ID appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>This seed is ordinarily 0, causing no fix to occur, but can be set to
2020-02-27 03:43:11 +02:00
a non-zero value to make testing Inform easier.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::rng_seed</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">fix_rng</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::rng_seed is used in 9/ma (<a href="9-ma.html#SP3_3_41_2_2_1">&#167;3.3.41.2.2.1</a>), 13/rsfk (<a href="13-rsfk.html#SP24">&#167;24</a>).</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>These functions are for steps on the production line which involve
2020-02-27 13:18:25 +02:00
referring something back up to Inbuild.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::load_types</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="identifier">Projects::load_types</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::begin_execution_at_to_begin</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Projects::Main_defined</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</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="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>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::load_types is used in 1/htc (<a href="1-htc.html#SP2_3">&#167;2.3</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function Task::begin_execution_at_to_begin is used in 22/ph (<a href="22-ph.html#SP13">&#167;13</a>).</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Project-related files and file paths. </b>An Inform compilation can touch dozens of different files, and the rest
2020-02-27 03:43:11 +02:00
of this section is a tour through the ones which are associated with the
project itself. (Common resources, used for all compilations, or optional
add-ins such as extensions are the business of Inbuild.)
</p>
<p class="inwebparagraph">If a project is called, say, Wuthering Heights, and is a "bundle" as created
and compiled by the Inform app, then:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) The project path will be <code class="display"><span class="extract">Wuthering Heights.inform</span></code>. This looks opaque
on MacOS, as if a file, but on all platforms it is in fact a directory.
</li><li>(b) Within it is <code class="display"><span class="extract">Wuthering Heights.inform/Build</span></code>, the "build folder".
</li><li>(c) Alongside it is <code class="display"><span class="extract">Wuthering Heights.materials</span></code>. This is also a directory,
but is openly accessible even on MacOS.
</li></ul>
<p class="inwebparagraph">If Inform is working on a single source text file, not a bundle, then the
project will be the current working directory, but now the build folder will
be the Inbuild transient area, and materials (if present) will again be
alongside.
</p>
<p class="inwebparagraph">To begin: what's in the project area? <code class="display"><span class="extract">story.ni</span></code> and <code class="display"><span class="extract">auto.inf</span></code>, neither
one very helpfully named, are defined in Inbuild rather than here: these
are the I7 source text and its compilation down to I6, respectively.
In addition we have:
</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>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::uuid_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"uuid.txt"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::ifiction_record_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Metadata.iFiction"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::manifest_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"manifest.plist"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::blurb_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::uuid_file appears nowhere else.</p>
<p class="endnote">The function Task::ifiction_record_file appears nowhere else.</p>
<p class="endnote">The function Task::manifest_file appears nowhere else.</p>
<p class="endnote">The function Task::blurb_file appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The build folder for a project contains all of the working files created
2020-02-27 03:43:11 +02:00
during the compilation process. The debugging log and Inform problems report
(its HTML file of error messages) are both written there: see the Main Routine
section for details. In addition we have:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::cblorb_report_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StatusCblorb.html"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::parse_tree_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Parse tree.txt"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::cblorb_report_file appears nowhere else.</p>
<p class="endnote">The function Task::parse_tree_file is used in 7/ptu (<a href="7-ptu.html#SP18">&#167;18</a>).</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>The name of the unblorbed story file is chosen for us by Inbuild, so
2020-02-27 03:43:11 +02:00
we have to extract it from the build graph:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::storyfile_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">unblorbed_vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"project graph not ready"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_internal_file</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::storyfile_file appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>Deeper inside the<code class="display"><span class="extract">Build</span></code> subfolder is an (also ephemeral) <code class="display"><span class="extract">Index</span></code> subfolder,
2020-02-27 03:43:11 +02:00
which holds the mini-website of the Index for a project.
</p>
<p class="inwebparagraph">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>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::index_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Index"</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">P</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::index_path is used in <a href="#SP13">&#167;13</a>, <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>.</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>An oddity in the Index folder is an XML file recording where the headings
2020-02-27 03:43:11 +02:00
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>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::xml_headings_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Task::index_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Headings.xml"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::xml_headings_file is used in 7/hdn (<a href="7-hdn.html#SP13">&#167;13</a>).</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Within the Index is a deeper level, into the weeds as it were, called
2020-02-27 03:43:11 +02:00
<code class="display"><span class="extract">Details</span></code>.
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::index_details_path</span><span class="plain">(</span><span class="reserved">void</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">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::index_path</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">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Task::index_details_path is used in <a href="#SP15">&#167;15</a>.</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>And the following routine determines the filename for a page in this
2020-02-27 03:43:11 +02:00
mini-website. Filenames down in the <code class="display"><span class="extract">Details</span></code> area have the form
<code class="display"><span class="extract">N_S</span></code> where <code class="display"><span class="extract">N</span></code> is an 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">Task::index_file</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">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="functiontext">Task::index_details_path</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="functiontext">Task::index_path</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 Task::index_file appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>That's it for the project folder, but other project-related stuff is in
2020-02-27 03:43:11 +02:00
the materials folder, which we turn to next.
</p>
<p class="inwebparagraph">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="inwebparagraph">By default the story file will be called something like <code class="display"><span class="extract">story.z8</span></code>, but
its leafname is actually declared from the source text of the Inform
project created to do this wrapping-up. So we need a way to set as well
as read this filename. Whatever the leafname, though, it lives in the top
level of materuals.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Task::wraps_existing_storyfile</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)?</span><span class="identifier">TRUE</span><span class="plain">:</span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::set_existing_storyfile</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain"> == </span><span class="identifier">NULL</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">"story.%S"</span><span class="plain">, </span><span class="identifier">TargetVMs::get_unblorbed_extension</span><span class="plain">(</span><span class="functiontext">Task::vm</span><span class="plain">()));</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::existing_storyfile_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;existing_storyfile</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::wraps_existing_storyfile is used in 5/ipw (<a href="5-ipw.html#SP2">&#167;2</a>), 13/rsfk (<a href="13-rsfk.html#SP5">&#167;5</a>), 17/tl (<a href="17-tl.html#SP14_1">&#167;14.1</a>).</p>
<p class="endnote">The function Task::set_existing_storyfile appears nowhere else.</p>
<p class="endnote">The function Task::existing_storyfile_file appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Materials is also where cover art lives: it could have either the file
2020-02-27 03:43:11 +02:00
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>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::large_cover_art_file</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">JPEG</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">JPEG</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.jpg"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.png"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Task::epsmap_file</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</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">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Inform Map.eps"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::figures_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::sounds_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::large_cover_art_file appears nowhere else.</p>
<p class="endnote">The function Task::epsmap_file appears nowhere else.</p>
<p class="endnote">The function Task::figures_path appears nowhere else.</p>
<p class="endnote">The function Task::sounds_path appears nowhere else.</p>
2020-03-11 02:21:09 +02:00
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>On a release run, Inblorb will populate the Release subfolder of Materials;
2020-02-27 03:43:11 +02:00
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>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::release_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;materials</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_figures_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_sounds_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Task::released_interpreter_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Task::release_path</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"interpreter"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Task::release_path appears nowhere else.</p>
<p class="endnote">The function Task::released_figures_path appears nowhere else.</p>
<p class="endnote">The function Task::released_sounds_path appears nowhere else.</p>
<p class="endnote">The function Task::released_interpreter_path appears nowhere else.</p>
<hr class="tocbar">
2020-02-27 13:18:25 +02:00
<ul class="toc"><li><a href="1-mr.html">Back to 'Main Routine'</a></li><li><a href="1-htc.html">Continue with 'How To Compile'</a></li></ul><hr class="tocbar">
2020-02-27 03:43:11 +02:00
<!--End of weave-->
</body>
</html>