1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-17 06:24:24 +03:00
inform7/docs/inbuild-module/3-bg.html

459 lines
67 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/nst</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +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-02-27 13:18:25 +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 tools</b></a></li>
2020-03-19 02:11:25 +02:00
<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-02-27 13:18:25 +02:00
<!--Weave of '3/bg' generated by 7-->
2020-03-30 02:30:20 +03:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Build Graphs</b></li></ul><p class="purpose">Graphs in which vertices correspond to files or copies, and edges to dependencies between them.</p>
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<ul class="toc"><li><a href="#SP1">&#167;1. Build graphs</a></li><li><a href="#SP2">&#167;2. Creation</a></li><li><a href="#SP6">&#167;6. Writing</a></li><li><a href="#SP9">&#167;9. Archiving</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
2020-03-30 02:30:20 +03:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build graphs. </b>See the Inbuild manual for an introduction to the build graph. Properly
speaking, it is a directed acyclic multigraph which us usually disconnected.
2020-02-27 13:18:25 +02:00
</p>
2020-03-30 02:30:20 +03:00
<p class="inwebparagraph">There are two colours of edge: build edges and use edges. A build edge between
A and B means that B must exist and be up-to-date before A can be built.
A use edge between A and B means that B must exist and be up-to-date before
A can be used.
</p>
<p class="inwebparagraph">There are three colours of vertex: copy, file and requirement. Copy vertices
correspond to copies which the user does have; requirement vertices to copies
which she doesn't have; and file vertices to unmanaged plain files in
the build process. For example, if an Inform project says it wants to include
an extension which isn't anywhere to be seen, then the project itself is a
copy vertex, as are the Standard Rules extension, the CommandParserKit kit,
and such; the missing extension is represneted by a requirement vertex; and
the story file which the project would compile to, if only it could be
compiled, is a file vertex.
2020-02-27 13:18:25 +02:00
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">COPY_VERTEX</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">FILE_VERTEX</span>
2020-03-30 02:30:20 +03:00
<span class="definitionkeyword">enum</span> <span class="constant">REQUIREMENT_VERTEX</span>
2020-02-27 13:18:25 +02:00
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">type</span><span class="plain">; </span><span class="comment">one of the <code class="display"><span class="extract">*_VERTEX</span></code> values above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">build_edges</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">use_edges</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
2020-03-30 02:30:20 +03:00
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">as_copy</span><span class="plain">; </span><span class="comment">for <code class="display"><span class="extract">COPY_VERTEX</span></code> only</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">as_file</span><span class="plain">; </span><span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> only</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">as_requirement</span><span class="plain">; </span><span class="comment">for <code class="display"><span class="extract">REQUIREMENT_VERTEX</span></code> only</span>
2020-03-30 02:30:20 +03:00
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">source_source</span><span class="plain">; </span><span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> of a file of I7 source text</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">as_source_file</span><span class="plain">; </span><span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> of a file of I7 source text</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_described_in_generation</span><span class="plain">; </span><span class="comment">used when recursively printing a graph</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">build_result</span><span class="plain">; </span><span class="comment">whether the most recent build of this succeeded...</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_built_in_generation</span><span class="plain">; </span><span class="comment">...in this build generation</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">always_build_this</span><span class="plain">; </span><span class="comment">i.e., don't look at timestamps hoping to skip it</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">script</span><span class="plain">; </span><span class="comment">how to build what this node represents</span>
2020-03-30 02:30:20 +03:00
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_vertex</span><span class="plain">;</span>
2020-03-30 02:30:20 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The structure build_vertex is accessed in 1/ic, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/kts, 5/ls, 5/ps, 5/ps2, 5/ts, 6/hdn, 6/inc, 7/ed, 7/ed2 and here.</p>
2020-03-30 02:30:20 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Creation. </b>First, the three colours of vertex.
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::file_vertex</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="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> = </span><span class="constant">FILE_VERTEX</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain">);</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_file</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">source_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_source_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">last_described_in_generation</span><span class="plain"> = -1;</span>
2020-03-30 14:23:06 +03:00
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_result</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">; </span><span class="comment">has never been built</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">last_built_in_generation</span><span class="plain"> = -1; </span><span class="comment">never seen in any generation</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">always_build_this</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">script</span><span class="plain"> = </span><span class="functiontext">BuildScripts::new</span><span class="plain">();</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::req_vertex</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</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 requirement"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> = </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">&#167;3</a>, 5/kts (<a href="5-kts.html#SP13">&#167;13</a>, <a href="5-kts.html#SP13_1">&#167;13.1</a>, <a href="5-kts.html#SP13_3">&#167;13.3</a>), 5/ps2 (<a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP4">&#167;4</a>).</p>
2020-03-30 02:30:20 +03:00
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP13_4">&#167;13.4</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
2020-03-30 02:30:20 +03:00
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Note that each copy is assigned exactly one copy vertex, when it is created.
This function should never otherwise be called.
</p>
<pre class="display">
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::copy_vertex</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="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="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"already set"</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain">-&gt;</span><span class="identifier">type</span><span class="plain"> = </span><span class="constant">COPY_VERTEX</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">vertex</span><span class="plain">;</span>
2020-03-30 14:23:06 +03:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::copy_vertex is used in 2/cps (<a href="2-cps.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Next, the two colours of edge. Note that between A and B there can be
2020-03-30 02:30:20 +03:00
at most one edge of each colour.
</p>
2020-02-27 13:18:25 +02:00
2020-03-30 02:30:20 +03:00
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</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 from"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to</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 to"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"graph node depends on itself"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">build_edges</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">V</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</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 from"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to</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 to"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"graph node depends on itself"</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">use_edges</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">V</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Graphs::need_this_to_build is used in 5/kts (<a href="5-kts.html#SP13_1">&#167;13.1</a>, <a href="5-kts.html#SP13_2">&#167;13.2</a>, <a href="5-kts.html#SP13_3">&#167;13.3</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
2020-03-30 02:30:20 +03:00
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Graphs::need_this_to_use is used in 5/kts (<a href="5-kts.html#SP13_4">&#167;13.4</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>).</p>
2020-03-30 02:30:20 +03:00
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The script attached to a vertex is a list of instructions for how to build
2020-03-30 02:30:20 +03:00
the resource it refers to. Some vertices have no instructions provided, so:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::can_be_built</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">BuildScripts::script_length</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">script</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-30 02:30:20 +03:00
<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-02-27 13:18:25 +02:00
2020-03-30 02:30:20 +03:00
<p class="endnote">The function Graphs::can_be_built is used in 3/ib (<a href="3-ib.html#SP7_1">&#167;7.1</a>).</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Writing. </b>This is a suitably indented printout of the graph as seen from a given
2020-03-30 02:30:20 +03:00
vertex: it's used by the Inbuild command <code class="display"><span class="extract">-graph</span></code>.
</p>
<pre class="display">
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_desc_generations</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">recurse</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Graphs::describe_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">recurse</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">, </span><span class="identifier">no_desc_generations</span><span class="plain">++);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe_r</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">,</span>
2020-03-30 02:30:20 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">recurse</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">stem</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">following_build_edge</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">description_round</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">following_build_edge</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--build-&gt; "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">following_build_edge</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--use---&gt; "</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="functiontext">Graphs::describe_vertex</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">switch</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="reserved">case</span><span class="plain"> </span><span class="identifier">COPY_VERTEX:</span><span class="plain"> </span><span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_copy</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="identifier">REQUIREMENT_VERTEX:</span><span class="plain"> </span><span class="functiontext">Requirements::write</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</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="identifier">FILE_VERTEX:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%f"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_file</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="string">"%p"</span><span class="plain">, </span><span class="identifier">stem</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">))) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"... "</span><span class="plain">); </span><span class="identifier">Str::substr</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Str::at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">)), </span><span class="identifier">Str::end</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">last_described_in_generation</span><span class="plain"> == </span><span class="identifier">description_round</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" q.v.\n"</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="element">last_described_in_generation</span><span class="plain"> = </span><span class="identifier">description_round</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</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">recurse</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">) </span><span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">-&gt;</span><span class="element">location_if_path</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="element">as_file</span><span class="plain">)</span>
<span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_file</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain">)</span>
2020-03-30 02:30:20 +03:00
<span class="functiontext">Graphs::describe_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">stem</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">description_round</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain">)</span>
2020-03-30 02:30:20 +03:00
<span class="functiontext">Graphs::describe_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">stem</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">description_round</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe_vertex</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">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"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;none&gt;"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">COPY_VERTEX:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[c%d]"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</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="identifier">REQUIREMENT_VERTEX:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[r%d]"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</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="identifier">FILE_VERTEX:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[f%d]"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::describe is used in 2/cps (<a href="2-cps.html#SP11">&#167;11</a>), 3/ib (<a href="3-ib.html#SP7">&#167;7</a>, <a href="3-ib.html#SP7_1_3">&#167;7.1.3</a>).</p>
2020-03-11 02:21:09 +02:00
2020-03-30 02:30:20 +03:00
<p class="endnote">The function Graphs::describe_r appears nowhere else.</p>
<p class="endnote">The function Graphs::describe_vertex appears nowhere else.</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>A similar but slightly different recursion for <code class="display"><span class="extract">-build-needs</span></code> and <code class="display"><span class="extract">-use-needs</span></code>.
2020-03-30 02:30:20 +03:00
</p>
<pre class="display">
2020-03-26 21:22:26 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::show_needs</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Graphs::show_needs_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::show_needs_r</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S: "</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">-&gt;</span><span class="element">genre_name</span><span class="plain">);</span>
<span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">depth</span><span class="plain">++;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">-&gt;</span><span class="element">genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
2020-03-30 02:30:20 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", need version in range "</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", any version will do"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">depth</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uses_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain">)</span>
2020-03-26 21:22:26 +02:00
<span class="functiontext">Graphs::show_needs_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">true_depth</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">uses_only</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="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain">)</span>
2020-03-26 21:22:26 +02:00
<span class="functiontext">Graphs::show_needs_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::show_needs is used in 2/cps (<a href="2-cps.html#SP11">&#167;11</a>).</p>
2020-03-11 02:21:09 +02:00
2020-03-30 02:30:20 +03:00
<p class="endnote">The function Graphs::show_needs_r appears nowhere else.</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And for <code class="display"><span class="extract">-build-missing</span></code> and <code class="display"><span class="extract">-use-missing</span></code>.
2020-03-30 02:30:20 +03:00
</p>
<pre class="display">
2020-03-26 21:22:26 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::show_missing</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Graphs::show_missing_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::show_missing_r</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="constant">0</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="element">type</span><span class="plain"> == </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">-&gt;</span><span class="element">genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
2020-03-30 02:30:20 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", need version in range "</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">as_requirement</span><span class="plain">-&gt;</span><span class="element">version_range</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", any version will do"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
2020-03-26 21:22:26 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">uses_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain">)</span>
2020-03-26 21:22:26 +02:00
<span class="identifier">N</span><span class="plain"> += </span><span class="functiontext">Graphs::show_missing_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">true_depth</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">uses_only</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="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain">)</span>
2020-03-26 21:22:26 +02:00
<span class="identifier">N</span><span class="plain"> += </span><span class="functiontext">Graphs::show_missing_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">uses_only</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
</pre>
2020-03-11 02:21:09 +02:00
2020-03-30 02:30:20 +03:00
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::show_missing is used in 2/cps (<a href="2-cps.html#SP11">&#167;11</a>, <a href="2-cps.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Graphs::show_missing_r appears nowhere else.</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Archiving. </b>This isn't simply a matter of printing out, of course, but very similar code
2020-03-30 02:30:20 +03:00
handles <code class="display"><span class="extract">-archive</span></code> and <code class="display"><span class="extract">-archive-to N</span></code>.
</p>
<p class="inwebparagraph">Note that the English language definition, which lives in the internal nest,
cannot be read from any other nest &mdash; so we won't archive it.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::archive</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Graphs::archive_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::archive_r</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</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">V</span><span class="plain">-&gt;</span><span class="element">as_copy</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Genres::stored_in_nests</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"English"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">author_name</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)))</span>
2020-03-30 14:23:06 +03:00
&lt;<span class="cwebmacro">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">build_edges</span><span class="plain">)</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">Graphs::archive_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) &amp;&amp; (</span><span class="identifier">true_depth</span><span class="plain"> &gt; </span><span class="constant">0</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="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">use_edges</span><span class="plain">)</span>
2020-03-11 02:21:09 +02:00
<span class="functiontext">Graphs::archive_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">true_depth</span><span class="plain">+1, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="endnote">The function Graphs::archive is used in 2/cps (<a href="2-cps.html#SP12">&#167;12</a>).</p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function Graphs::archive_r appears nowhere else.</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b>The most delicate thing here is that we don't want to archive something
2020-03-30 02:30:20 +03:00
to <code class="display"><span class="extract">N</span></code> if it's already there; but that is difficult to detect.
</p>
2020-02-27 13:18:25 +02:00
2020-03-30 02:30:20 +03:00
<p class="macrodefinition"><code class="display">
2020-03-30 14:23:06 +03:00
&lt;<span class="cwebmacrodefn">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>&gt; =
2020-02-27 13:18:25 +02:00
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S: "</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">-&gt;</span><span class="element">genre_name</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_file</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_file</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="string">"%p/"</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">location</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">, </span><span class="string">"%p/"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">))) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" -- already there\n"</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" -- archiving\n"</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
<span class="functiontext">Copies::copy_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-30 02:30:20 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
</pre>
<p class="inwebparagraph"></p>
2020-03-30 14:23:06 +03:00
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
2020-02-27 13:18:25 +02:00
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 3: Incremental Builds.)</i></li><li><a href="3-bm.html">Continue with 'Build Methodology'</a></li></ul><hr class="tocbar">
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>