1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 14:04:24 +03:00
inform7/docs/inbuild/1-mn.html

570 lines
66 KiB
HTML
Raw Normal View History

2020-01-28 00:51:46 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-03-27 01:26:35 +02:00
<title>M/rc</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-01-28 00:51:46 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-01-28 00:51:46 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler</b></a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2020-01-28 00:51:46 +02:00
<!--Weave of '1/mn' generated by 7-->
2020-03-26 21:22:26 +02:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Tools</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#1">Chapter 1: Inbuild outside of Inform</a></li><li><b>Main</b></li></ul><p class="purpose">A command-line interface for Inbuild functions which are not part of the normal operation of the Inform compiler.</p>
2020-01-28 00:51:46 +02:00
2020-03-26 21:22:26 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Main routine</a></li><li><a href="#SP1_6">&#167;1.6. Target list</a></li><li><a href="#SP1_7">&#167;1.7. Command line</a></li><li><a href="#SP4">&#167;4. Interface to Words module</a></li><li><a href="#SP6">&#167;6. Interface to Syntax module</a></li></ul><hr class="tocbar">
2020-01-28 00:51:46 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Main routine. </b>When Inbuild is called at the command line, it begins at <code class="display"><span class="extract">main</span></code>, like all C
programs.
</p>
2020-01-28 00:51:46 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph">Inbuild manages "copies", which are instances of programs or resources found
somewhere in the file system. The copies which it acts on in a given run are
called "targets". The task of <code class="display"><span class="extract">main</span></code> is to read the command-line arguments,
set the following variables as needed, and produce a list of targets to work
on; then to carry out that work, and then shut down again.
</p>
2020-01-28 00:51:46 +02:00
<pre class="display">
2020-03-26 21:22:26 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">INSPECT_TTASK</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inbuild</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_tools</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dry_run_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">build_trace_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">destination_nest</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">filter_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unit_test</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-01-28 00:51:46 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
2020-03-26 21:22:26 +02:00
&lt;<span class="cwebmacro">Start up the modules</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the command line</span> <span class="cwebmacronumber">1.7</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Load the Preform grammar</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Complete the list of targets</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Act on the targets</span> <span class="cwebmacronumber">1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Shut down the modules</span> <span class="cwebmacronumber">1.5</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 1/ic (<a href="1-ic.html#SP15">&#167;15</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-01-28 00:51:46 +02:00
<span class="functiontext">Foundation::start</span><span class="plain">();</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">WordsModule::start</span><span class="plain">();</span>
<span class="functiontext">SyntaxModule::start</span><span class="plain">();</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">HTMLModule::start</span><span class="plain">();</span>
<span class="functiontext">ArchModule::start</span><span class="plain">();</span>
<span class="functiontext">InbuildModule::start</span><span class="plain">();</span>
2020-03-26 21:22:26 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b>Preform is the crowning jewel of the <code class="display"><span class="extract">words</span></code> module, and parses excerpts of
natural-language text against a "grammar". The <code class="display"><span class="extract">inform7</span></code> executable makes very
heavy-duty use of Preform, but we use a much coarser grammar, which simply
breaks down source text into sentences, headings and so on. That grammar is
stored in a file called <code class="display"><span class="extract">Syntax.preform</span></code> inside the installation of Inbuild,
which is why we need to have worked out <code class="display"><span class="extract">path_to_inbuild</span></code> (the pathname at
which we are installed) already. Once the following is run, Preform is ready
for use.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Load the Preform grammar</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">path_to_inbuild</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Syntax.preform"</span><span class="plain">);</span>
<span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="functiontext">Preform::load_from_file</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="functiontext">Preform::parse_preform</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">CommandLine::play_back_log</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3"></a><b>&#167;1.3. </b>Targets can arise in three ways:
</p>
<ul class="items"><li>(1) They can be specified at the command line, either as bare names of files
or paths, or with <code class="display"><span class="extract">-contents-of D</span></code> for a directory <code class="display"><span class="extract">D</span></code>. By the time the code
in this paragraph runs, those targets are already in the list.
</li><li>(2) They can be specified by a search request <code class="display"><span class="extract">-matching R</span></code> where <code class="display"><span class="extract">R</span></code> is a
list of requirements to match. We now add anything found that way. (We didn't
do so when reading the command line because at that time the search path for
nests did not yet exist: it is created when <code class="display"><span class="extract">Inbuild::optioneering_complete</span></code>
is called.)
</li><li>(3) One copy is always special to Inbuild: the "project", usually an Inform
project bundle with a pathname like <code class="display"><span class="extract">Counterfeit Monkey.inform</span></code>. We go
through a little dance with <code class="display"><span class="extract">Inbuild::optioneering_complete</span></code> to ensure that
if a project is already in the target list, Inbuild will use that; and if not,
but the user has specified a project to Inbuild already with <code class="display"><span class="extract">-project</span></code> (a
command-line option recognised by <code class="display"><span class="extract">inbuild</span></code> but not by us), then we add that
to the target list. Tne net result is that however the user indicates interest
in an Inform project bundle, it becomes both the Inbuild current project, and
also a member of our target list. It follows that we cannot have two project
bundles in the target list, because they cannot both be the current project;
and to avoid the user being confused when only one is acted on, we throw an
error in this case.
</li></ul>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Complete the list of targets</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Main::list_of_targets</span><span class="plain">();</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">proj</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain"> == </span><span class="identifier">project_bundle_genre</span><span class="plain">)</span>
<span class="identifier">proj</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">proj</span><span class="plain"> = </span><span class="functiontext">Inbuild::optioneering_complete</span><span class="plain">(</span><span class="identifier">proj</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</span><span class="plain">) </span><span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="identifier">proj</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain"> == </span><span class="identifier">project_bundle_genre</span><span class="plain">)</span>
<span class="identifier">count</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &gt; 1)</span>
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"can only work on one project bundle at a time"</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="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">filter_text</span><span class="plain">) &gt; 0) </span><span class="functiontext">Main::add_search_results_as_targets</span><span class="plain">(</span><span class="identifier">filter_text</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4"></a><b>&#167;1.4. </b>We make the function call <code class="display"><span class="extract">Inbuild::go_operational</span></code> to signal to <code class="display"><span class="extract">inbuild</span></code>
that we want to start work now.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Act on the targets</span> <span class="cwebmacronumber">1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Inbuild::go_operational</span><span class="plain">();</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">unit_test</span><span class="plain">) &gt; 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">unit_test</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"compatibility"</span><span class="plain">)) </span><span class="functiontext">Compatibility::test</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"no such unit test: %S"</span><span class="plain">, </span><span class="identifier">unit_test</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain"> = </span><span class="constant">SHELL_METHODOLOGY</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dry_run_mode</span><span class="plain">) </span><span class="identifier">use</span><span class="plain"> = </span><span class="constant">DRY_RUN_METHODOLOGY</span><span class="plain">;</span>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">path_to_tools</span><span class="plain">) </span><span class="identifier">BM</span><span class="plain"> = </span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="identifier">path_to_tools</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">use</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BM</span><span class="plain"> = </span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">path_to_inbuild</span><span class="plain">), </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">use</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">build_trace_mode</span><span class="plain">) </span><span class="identifier">trace_ibg</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Main::list_of_targets</span><span class="plain">();</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Carry out the required task on the copy C</span> <span class="cwebmacronumber">1.4.2</span>&gt;<span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="plain">}</span>
2020-03-26 21:22:26 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4_1"></a><b>&#167;1.4.1. </b>The list of possible tasks is as follows; they basically all correspond to
utility functions in the <code class="display"><span class="extract">inbuild</span></code> module, which we call.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">INSPECT_TTASK</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">GRAPH_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">USE_NEEDS_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_NEEDS_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TO_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">USE_MISSING_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_MISSING_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">REBUILD_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">COPY_TO_TTASK</span>
<span class="definitionkeyword">enum</span> <span class="constant">SYNC_TO_TTASK</span>
</pre>
<p class="inwebparagraph"><a id="SP1_4_2"></a><b>&#167;1.4.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Carry out the required task on the copy C</span> <span class="cwebmacronumber">1.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">inbuild_task</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INSPECT_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::inspect</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">GRAPH_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_graph</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">USE_NEEDS_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_needs</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_NEEDS_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_needs</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ARCHIVE_TTASK</span><span class="plain">:</span>
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Inbuild::materials_nest</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">destination_nest</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"no -project in use, so ignoring -archive"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Copies::archive</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ARCHIVE_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::archive</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">USE_MISSING_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_missing</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_MISSING_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_missing</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::build</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REBUILD_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::rebuild</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COPY_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Nests::copy_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SYNC_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Nests::copy_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_4">&#167;1.4</a>.</p>
<p class="inwebparagraph"><a id="SP1_5"></a><b>&#167;1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Shut down the modules</span> <span class="cwebmacronumber">1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-02-27 03:43:11 +02:00
<span class="functiontext">ArchModule::end</span><span class="plain">();</span>
<span class="functiontext">InbuildModule::end</span><span class="plain">();</span>
<span class="functiontext">HTMLModule::end</span><span class="plain">();</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">SyntaxModule::end</span><span class="plain">();</span>
<span class="functiontext">WordsModule::end</span><span class="plain">();</span>
2020-01-28 00:51:46 +02:00
<span class="functiontext">Foundation::end</span><span class="plain">();</span>
2020-03-26 21:22:26 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_6"></a><b>&#167;1.6. Target list. </b>This where we keep the list of targets, in which no copy occurs more than
once. The following code runs quadratically in the number of targets, but for
Inbuild this number is never likely to be more than about 100 at a time.
</p>
<pre class="display">
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inbuild_copy</span></code></span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">to_add</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">targets</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">targets</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">to_add</span><span class="plain">)</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">to_add</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">targets</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">Main::list_of_targets</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">targets</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_search_results_as_targets</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">req_text</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">errors</span><span class="plain">);</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="functiontext">Requirements::from_text</span><span class="plain">(</span><span class="identifier">req_text</span><span class="plain">, </span><span class="identifier">errors</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">errors</span><span class="plain">) &gt; 0) {</span>
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"requirement malformed: %S"</span><span class="plain">, </span><span class="identifier">errors</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_search_result</span><span class="plain">);</span>
<span class="functiontext">Nests::search_for</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">(), </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">inbuild_search_result</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">errors</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_directory_contents_targets</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Directories::next</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">, </span><span class="string">"%p%c%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="constant">FOLDER_SEPARATOR</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="functiontext">Directories::close</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">throwing_error</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">Copies::claim</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</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">throwing_error</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"unable to identify '%S'"</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2020-01-28 00:51:46 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-26 21:22:26 +02:00
<p class="endnote">The function Main::add_target is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="endnote">The function Main::list_of_targets is used in <a href="#SP1_3">&#167;1.3</a>, <a href="#SP1_4">&#167;1.4</a>.</p>
<p class="endnote">The function Main::add_search_results_as_targets is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="endnote">The function Main::add_directory_contents_targets is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">The function Main::add_file_or_path_as_target is used in <a href="#SP3">&#167;3</a>.</p>
2020-01-28 00:51:46 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP1_7"></a><b>&#167;1.7. Command line. </b>Note the call below to <code class="display"><span class="extract">Inbuild::declare_options</span></code>, which adds a whole lot of
other options to the selection defined here.
2020-01-28 00:51:46 +02:00
</p>
2020-02-27 03:43:11 +02:00
<pre class="definitions">
2020-03-26 21:22:26 +02:00
<span class="definitionkeyword">define</span> <span class="constant">INTOOL_NAME</span><span class="plain"> </span><span class="string">"inbuild"</span>
2020-02-27 03:43:11 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">REBUILD_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">GRAPH_CLSW</span>
2020-03-26 21:22:26 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">USE_NEEDS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_NEEDS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">USE_MISSING_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_MISSING_CLSW</span>
2020-03-11 02:21:09 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TO_CLSW</span>
2020-02-27 03:43:11 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">INSPECT_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">DRY_CLSW</span>
2020-03-11 02:21:09 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_TRACE_CLSW</span>
2020-02-27 03:43:11 +02:00
<span class="definitionkeyword">enum</span> <span class="constant">TOOLS_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">CONTENTS_OF_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">MATCHING_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">COPY_TO_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">SYNC_TO_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">UNIT_TEST_CLSW</span>
</pre>
2020-03-26 21:22:26 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Read the command line</span> <span class="cwebmacronumber">1.7</span>&gt; =
2020-01-28 00:51:46 +02:00
</code></p>
<pre class="displaydefn">
<span class="functiontext">CommandLine::declare_heading</span><span class="plain">(</span>
<span class="identifier">L</span><span class="string">"[[Purpose]]\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">L</span><span class="string">"usage: inbuild [-TASK] TARGET1 TARGET2 ...\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">COPY_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"copy-to"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"copy target(s) to nest X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SYNC_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sync-to"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"forcibly copy target(s) to nest X, even if prior version already there"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"incrementally build target(s)"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">REBUILD_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"rebuild"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"completely rebuild target(s)"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">INSPECT_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"inspect"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show target(s) but take no action"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">GRAPH_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"graph"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show dependency graph of target(s) but take no action"</span><span class="plain">);</span>
2020-03-26 21:22:26 +02:00
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">USE_NEEDS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"use-needs"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show all the extensions, kits and so on needed to use"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_NEEDS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-needs"</span><span class="plain">, 1,</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">L</span><span class="string">"show all the extensions, kits and so on needed to build"</span><span class="plain">);</span>
2020-03-26 21:22:26 +02:00
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">USE_MISSING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"use-missing"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show the extensions, kits and so on which are needed to use but missing"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_MISSING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-missing"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show the extensions, kits and so on which are needed to build but missing"</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">ARCHIVE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"archive"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"sync copies of all extensions, kits and so on needed for -project into Materials"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">ARCHIVE_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"archive-to"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"sync copies of all extensions, kits and so on needed into nest X"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TOOLS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"tools"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"make X the directory of intools executables, and exit developer mode"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="constant">DRY_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dry"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"make this a dry run (print but do not execute shell commands)"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="constant">BUILD_TRACE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-trace"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"show verbose reasoning during -build"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">MATCHING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"matching"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"apply to all works in nest(s) matching requirement X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">CONTENTS_OF_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"contents-of"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"apply to all targets in the directory X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">UNIT_TEST_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"unit-test"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"perform unit test X (for debugging inbuild only)"</span><span class="plain">);</span>
<span class="functiontext">Inbuild::declare_options</span><span class="plain">();</span>
2020-01-28 00:51:46 +02:00
<span class="functiontext">CommandLine::read</span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="functiontext">Main::option</span><span class="plain">, &amp;</span><span class="functiontext">Main::bareword</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="identifier">unsorted_nest_list</span><span class="plain">) == 0)</span>
<span class="functiontext">Inbuild::add_nest</span><span class="plain">(</span>
<span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7/Internal"</span><span class="plain">), </span><span class="constant">INTERNAL_NEST_TAG</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">path_to_inbuild</span><span class="plain"> = </span><span class="functiontext">Pathnames::installation_path</span><span class="plain">(</span><span class="string">"INBUILD_PATH"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inbuild"</span><span class="plain">);</span>
2020-01-28 00:51:46 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Here we handle those options not handled by the <code class="display"><span class="extract">inbuild</span></code> module.
</p>
2020-01-28 00:51:46 +02:00
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::option</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REBUILD_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">REBUILD_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INSPECT_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">INSPECT_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">GRAPH_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">GRAPH_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">USE_NEEDS_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">USE_NEEDS_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_NEEDS_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_NEEDS_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ARCHIVE_TO_CLSW</span><span class="plain">:</span>
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
<span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">ARCHIVE_TO_TTASK</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ARCHIVE_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">ARCHIVE_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">USE_MISSING_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">USE_MISSING_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_MISSING_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_MISSING_TTASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TOOLS_CLSW</span><span class="plain">: </span><span class="identifier">path_to_tools</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MATCHING_CLSW</span><span class="plain">: </span><span class="identifier">filter_text</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CONTENTS_OF_CLSW</span><span class="plain">:</span>
<span class="functiontext">Main::add_directory_contents_targets</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">)); </span><span class="reserved">break</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DRY_CLSW</span><span class="plain">: </span><span class="identifier">dry_run_mode</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_TRACE_CLSW</span><span class="plain">: </span><span class="identifier">build_trace_mode</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COPY_TO_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">COPY_TO_TTASK</span><span class="plain">;</span>
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SYNC_TO_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">SYNC_TO_TTASK</span><span class="plain">;</span>
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UNIT_TEST_CLSW</span><span class="plain">: </span><span class="identifier">unit_test</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Inbuild::option</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
2020-01-28 00:51:46 +02:00
<span class="plain">}</span>
2020-03-26 21:22:26 +02:00
</pre>
2020-01-28 00:51:46 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"></p>
2020-02-27 03:43:11 +02:00
2020-03-26 21:22:26 +02:00
<p class="endnote">The function Main::option is used in <a href="#SP1_7">&#167;1.7</a>.</p>
2020-02-27 03:43:11 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This is called for a command-line argument which doesn't appear as
subordinate to any switch; we take it as the name of a copy.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
2020-01-28 00:51:46 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-26 21:22:26 +02:00
<p class="endnote">The function Main::bareword is used in <a href="#SP1_7">&#167;1.7</a>.</p>
2020-02-27 03:43:11 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Interface to Words module. </b>Since we want to include the <code class="display"><span class="extract">words</span></code> module, we have to define the following
structure and initialiser. The type <code class="display"><span class="extract">vocabulary_meaning</span></code> is expected to hold
meanings associated with a given word; when <code class="display"><span class="extract">inform7</span></code> uses <code class="display"><span class="extract">word</span></code> it is rich
and full of significance, but for us it does nothing. We give it a meaningless
integer as its content, since in C it isn't legal to have an empty <code class="display"><span class="extract">struct</span></code>.
2020-02-27 03:43:11 +02:00
</p>
<pre class="definitions">
2020-03-26 21:22:26 +02:00
<span class="definitionkeyword">define</span> <span class="constant">VOCABULARY_MEANING_INITIALISER</span><span class="plain"> </span><span class="functiontext">Main::create_meaningless_vm</span>
2020-02-27 03:43:11 +02:00
</pre>
2020-01-28 00:51:46 +02:00
2020-02-27 03:43:11 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">vocabulary_meaning</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">enigmatic_number</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">vocabulary_meaning</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">vocabulary_meaning</span><span class="plain"> </span><span class="functiontext">Main::create_meaningless_vm</span><span class="plain">(</span><span class="reserved">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain">) {</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">vocabulary_meaning</span><span class="plain"> </span><span class="identifier">vm</span><span class="plain">;</span>
<span class="identifier">vm</span><span class="element">.enigmatic_number</span><span class="plain"> = 90125;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">vm</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-26 21:22:26 +02:00
<p class="endnote">The function Main::create_meaningless_vm appears nowhere else.</p>
2020-02-27 03:43:11 +02:00
2020-03-26 21:22:26 +02:00
<p class="endnote">The structure vocabulary_meaning is private to this section.</p>
2020-02-27 03:43:11 +02:00
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>We use the mighty Preform natural-language parser only a little when
Inbuild runs on its own, but it needs to be told what C type to use when
identifying natural languages.
</p>
2020-02-27 03:43:11 +02:00
2020-03-11 02:21:09 +02:00
2020-03-26 21:22:26 +02:00
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_TYPE</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span>
2020-03-11 02:21:09 +02:00
</pre>
2020-03-26 21:22:26 +02:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Interface to Syntax module. </b>Again, we make a fairly light use of <code class="display"><span class="extract">syntax</span></code> when Inbuild runs alone.
</p>
2020-03-11 02:21:09 +02:00
2020-03-26 21:22:26 +02:00
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">PARSE_TREE_TRAVERSE_TYPE</span><span class="plain"> </span><span class="reserved">void</span>
<span class="definitionkeyword">define</span> <span class="constant">PARSE_TREE_METADATA_SETUP</span><span class="plain"> </span><span class="functiontext">SourceText::node_metadata</span>
</pre>
2020-01-28 00:51:46 +02:00
<hr class="tocbar">
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-01-28 00:51:46 +02:00
</body>
</html>