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

428 lines
69 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>
2020-04-14 19:56:54 +03:00
<title>Build Graphs</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-04-14 19:56:54 +03:00
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">supervisor</span></a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../core-module/index.html">core</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>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Build Graphs' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</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
<ul class="toc"><li><a href="3-bg.html#SP1">&#167;1. Build graphs</a></li><li><a href="3-bg.html#SP2">&#167;2. Creation</a></li><li><a href="3-bg.html#SP6">&#167;6. Writing</a></li><li><a href="3-bg.html#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-14 19:56:54 +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-14 19:56:54 +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-14 19:56:54 +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-14 19:56:54 +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-14 19:56:54 +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-04-14 19:56:54 +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/ks, 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">
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::file_vertex<button class="popup" onclick="togglePopup('usagePopup116')">...<span class="popuptext" id="usagePopup116">Usage of <b>Graphs::file_vertex</b>:<br><a href="3-bg.html#SP3">&#167;3</a>, Kits - <a href="5-ks.html#SP13">&#167;13</a>, <a href="5-ks.html#SP13_1">&#167;13.1</a>, <a href="5-ks.html#SP13_3">&#167;13.3</a><br>Project Services - <a href="5-ps2.html#SP1">&#167;1</a>, <a href="5-ps2.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</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">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-14 19:56:54 +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>
2020-04-07 03:06:09 +03:00
<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>
2020-04-14 19:56:54 +03:00
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="element">script</span><span class="plain"> = </span><span class="functiontext"><a href="3-bs.html#SP1">BuildScripts::new</a></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-04-14 19:56:54 +03:00
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::req_vertex<button class="popup" onclick="togglePopup('usagePopup117')">...<span class="popuptext" id="usagePopup117">Usage of <b>Graphs::req_vertex</b>:<br>Kits - <a href="5-ks.html#SP13_4">&#167;13.4</a><br>Inclusions - <a href="6-inc.html#SP6_1">&#167;6.1</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_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">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"><a href="3-bg.html#SP2">Graphs::file_vertex</a></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-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">
2020-04-14 19:56:54 +03:00
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::copy_vertex<button class="popup" onclick="togglePopup('usagePopup118')">...<span class="popuptext" id="usagePopup118">Usage of <b>Graphs::copy_vertex</b>:<br>Copies - <a href="2-cps.html#SP2">&#167;2</a></span></button></span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
2020-03-30 14:23:06 +03:00
<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"><a href="3-bg.html#SP2">Graphs::file_vertex</a></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">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="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-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_build<button class="popup" onclick="togglePopup('usagePopup119')">...<span class="popuptext" id="usagePopup119">Usage of <b>Graphs::need_this_to_build</b>:<br>Kits - <a href="5-ks.html#SP13_1">&#167;13.1</a>, <a href="5-ks.html#SP13_2">&#167;13.2</a>, <a href="5-ks.html#SP13_3">&#167;13.3</a><br>Project Services - <a href="5-ps2.html#SP4">&#167;4</a><br>Inclusions - <a href="6-inc.html#SP1_1">&#167;1.1</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a></span></button></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>
2020-02-27 13:18:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::need_this_to_use<button class="popup" onclick="togglePopup('usagePopup120')">...<span class="popuptext" id="usagePopup120">Usage of <b>Graphs::need_this_to_use</b>:<br>Kits - <a href="5-ks.html#SP13_4">&#167;13.4</a><br>Project Services - <a href="5-ps2.html#SP4">&#167;4</a><br>Inclusions - <a href="6-inc.html#SP1_1">&#167;1.1</a></span></button></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>
2020-02-27 13:18:25 +02:00
<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-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">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::can_be_built<button class="popup" onclick="togglePopup('usagePopup121')">...<span class="popuptext" id="usagePopup121">Usage of <b>Graphs::can_be_built</b>:<br>Incremental Building - <a href="3-ib.html#SP7_1">&#167;7.1</a></span></button></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="functiontext"><a href="3-bs.html#SP1">BuildScripts::script_length</a></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 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-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe<button class="popup" onclick="togglePopup('usagePopup122')">...<span class="popuptext" id="usagePopup122">Usage of <b>Graphs::describe</b>:<br>Copies - <a href="2-cps.html#SP11">&#167;11</a><br>Incremental Building - <a href="3-ib.html#SP7">&#167;7</a>, <a href="3-ib.html#SP7_1_3">&#167;7.1.3</a></span></button></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>
<span class="functiontext"><a href="3-bg.html#SP6">Graphs::describe_r</a></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>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe_r<button class="popup" onclick="togglePopup('usagePopup123')">...<span class="popuptext" id="usagePopup123">Usage of <b>Graphs::describe_r</b>:<br>none</span></button></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>
<span class="functiontext"><a href="3-bg.html#SP6">Graphs::describe_vertex</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">COPY_VERTEX:</span><span class="plain"> </span><span class="functiontext"><a href="2-cps.html#SP6">Copies::write_copy</a></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"><a href="2-rqr.html#SP6">Requirements::write</a></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>
2020-04-07 03:06:09 +03:00
<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::up</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>
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>
<span class="functiontext"><a href="3-bg.html#SP6">Graphs::describe_r</a></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>
<span class="functiontext"><a href="3-bg.html#SP6">Graphs::describe_r</a></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>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::describe_vertex<button class="popup" onclick="togglePopup('usagePopup124')">...<span class="popuptext" id="usagePopup124">Usage of <b>Graphs::describe_vertex</b>:<br>none</span></button></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>
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">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>
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-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::show_needs<button class="popup" onclick="togglePopup('usagePopup125')">...<span class="popuptext" id="usagePopup125">Usage of <b>Graphs::show_needs</b>:<br>Copies - <a href="2-cps.html#SP11">&#167;11</a></span></button></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>
<span class="functiontext"><a href="3-bg.html#SP7">Graphs::show_needs_r</a></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-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::show_needs_r<button class="popup" onclick="togglePopup('usagePopup126')">...<span class="popuptext" id="usagePopup126">Usage of <b>Graphs::show_needs_r</b>:<br>none</span></button></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>
2020-03-30 02:30:20 +03:00
<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>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-cps.html#SP6">Copies::write_copy</a></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>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-wrk.html#SP5">Works::write</a></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>
2020-04-07 03:06:09 +03:00
<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>
<span class="functiontext"><a href="3-bg.html#SP7">Graphs::show_needs_r</a></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>
<span class="functiontext"><a href="3-bg.html#SP7">Graphs::show_needs_r</a></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>
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-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::show_missing<button class="popup" onclick="togglePopup('usagePopup127')">...<span class="popuptext" id="usagePopup127">Usage of <b>Graphs::show_missing</b>:<br>Copies - <a href="2-cps.html#SP11">&#167;11</a>, <a href="2-cps.html#SP12">&#167;12</a></span></button></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>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-bg.html#SP8">Graphs::show_missing_r</a></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-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Graphs::show_missing_r<button class="popup" onclick="togglePopup('usagePopup128')">...<span class="popuptext" id="usagePopup128">Usage of <b>Graphs::show_missing_r</b>:<br>none</span></button></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>
2020-03-30 02:30:20 +03:00
<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>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-wrk.html#SP5">Works::write</a></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>
2020-04-07 03:06:09 +03:00
<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>
<span class="identifier">N</span><span class="plain"> += </span><span class="functiontext"><a href="3-bg.html#SP8">Graphs::show_missing_r</a></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>
<span class="identifier">N</span><span class="plain"> += </span><span class="functiontext"><a href="3-bg.html#SP8">Graphs::show_missing_r</a></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>
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">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::archive<button class="popup" onclick="togglePopup('usagePopup129')">...<span class="popuptext" id="usagePopup129">Usage of <b>Graphs::archive</b>:<br>Copies - <a href="2-cps.html#SP12">&#167;12</a></span></button></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>
2020-03-30 02:30:20 +03:00
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
<span class="functiontext"><a href="3-bg.html#SP9">Graphs::archive_r</a></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-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::archive_r<button class="popup" onclick="togglePopup('usagePopup130')">...<span class="popuptext" id="usagePopup130">Usage of <b>Graphs::archive_r</b>:<br>none</span></button></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>
2020-03-30 02:30:20 +03:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="2-gnr.html#SP2">Genres::stored_in_nests</a></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>
2020-04-07 03:06:09 +03:00
<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>
<span class="functiontext"><a href="3-bg.html#SP9">Graphs::archive_r</a></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>
<span class="functiontext"><a href="3-bg.html#SP9">Graphs::archive_r</a></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-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-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-cps.html#SP6">Copies::write_copy</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
2020-03-30 02:30:20 +03:00
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::up</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-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-cps.html#SP13">Copies::copy_to</a></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>
<p class="endnote">This code is used in <a href="3-bg.html#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-04-14 19:56:54 +03:00
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>