1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/inbuild-module/2-nst.html

285 lines
27 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/rqr</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 '2/nst' generated by 7-->
2020-03-22 12:50:19 +02: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#2">Chapter 2: Conceptual Framework</a></li><li><b>Nests</b></li></ul><p class="purpose">Nests are repositories of Inform-related resources.</p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP4">&#167;4. Search list</a></li><li><a href="#SP5">&#167;5. Search results</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Creation. </b>To "create" a nest here does not mean actually altering the file system, for
example by making a directory: nests here are merely notes in memory of
positions in the file system hierarchy which may or may not exist.
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_nest</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">location</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">read_only</span><span class="plain">; </span><span class="comment">files cannot be written into this nest</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tag_value</span><span class="plain">; </span><span class="comment">used to indicate whether internal, external, and such</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inbuild_nest</span><span class="plain">;</span>
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inbuild_nest</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">location</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">read_only</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">tag_value</span><span class="plain"> = -1;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::new is used in 1/ic (<a href="1-ic.html#SP13">&#167;13</a>).</p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The structure inbuild_nest is accessed in 1/ic, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/tm, 5/ps2 and here.</p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Nests used by the Inform and Inbuild tools are tagged with the following
comstamts. (There used to be quite a good joke here, but refactoring of the
code removed its premiss. Literate programming is like that sometimes.)
</p>
<p class="inwebparagraph">The sequence of the following enumerated values is very significant &mdash;
see below for why. Lower-tag-numbered origins are better than later ones.
</p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">MATERIALS_NEST_TAG</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXTERNAL_NEST_TAG</span>
<span class="definitionkeyword">enum</span> <span class="constant">GENERIC_NEST_TAG</span>
<span class="definitionkeyword">enum</span> <span class="constant">INTERNAL_NEST_TAG</span>
</pre>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Nests::get_tag</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">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">-&gt;</span><span class="identifier">tag_value</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">Nests::set_tag</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">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</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 nest"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">tag_value</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The function Nests::get_tag is used in <a href="#SP9">&#167;9</a>, 1/ic (<a href="1-ic.html#SP14">&#167;14</a>), 3/is2 (<a href="3-is2.html#SP1">&#167;1</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP1">&#167;1</a>, <a href="7-ec.html#SP3_1">&#167;3.1</a>, <a href="7-ec.html#SP3_2">&#167;3.2</a>).</p>
2020-03-29 19:39:17 +03:00
<p class="endnote">The function Nests::set_tag is used in 1/ic (<a href="1-ic.html#SP13">&#167;13</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Nests::protect</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-04-07 03:06:09 +03:00
<span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">read_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="endnote">The function Nests::protect is used in 1/ic (<a href="1-ic.html#SP13">&#167;13</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Search list. </b>When we search for copies, we do so by looking through nests in a list. The
following builds such lists, removing duplicates &mdash; where duplicates are
shown up by having the same textual form of pathname. (This is not foolproof
by any means: Unix is replete with ways to describe the same directory, thanks
to simlinks, <code class="display"><span class="extract">~</span></code> and so on. But in the circumstances arising inside Inbuild,
it will do. In any case, having duplicates would not actually matter: it
would just produce search results which were more copious than needed.)
</p>
<pre class="display">
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Nests::add_to_search_sequence</span><span class="plain">(</span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search_list</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="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">NS</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">NS</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-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">already_here</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain">, </span><span class="identifier">search_list</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">MS</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">NS</span><span class="plain">, </span><span class="string">"%p"</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">location</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">Str::eq</span><span class="plain">(</span><span class="identifier">NS</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">)) </span><span class="identifier">already_here</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">NS</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">already_here</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain">, </span><span class="identifier">search_list</span><span class="plain">);</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::add_to_search_sequence appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Search results. </b>When we search a list of nests for copies satisfying certain requirements,
we create one of these for each hit:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_search_result</span><span class="plain"> {</span>
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">copy</span><span class="plain">; </span><span class="comment">what was found</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">nest</span><span class="plain">; </span><span class="comment">from whence it came</span>
2020-03-29 19:39:17 +03:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inbuild_search_result</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The structure inbuild_search_result is accessed in 2/ce, 3/is, 5/kts, 5/ls, 6/inc, 7/ed2, 7/ec and here.</p>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>These can be created only as entries in a list:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Nests::add_search_result</span><span class="plain">(</span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">results</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">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">,</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">) {</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inbuild_search_result</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">R</span><span class="plain">-&gt;</span><span class="element">nest</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">R</span><span class="plain">-&gt;</span><span class="element">copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">found_by</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">;</span>
2020-03-29 19:39:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">req</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">"bad search result"</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">inbuild_search_result</span><span class="plain">, </span><span class="identifier">results</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The function Nests::add_search_result is used in 4/em (<a href="4-em.html#SP6">&#167;6</a>), 4/km (<a href="4-km.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP5">&#167;5</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>), 4/tm (<a href="4-tm.html#SP5">&#167;5</a>).</p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>And here is our search engine, such as it is. For each nest, we ask each
genre's manager to look for copies of that genre:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Nests::search_for</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">,</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search_list</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">results</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain">, </span><span class="identifier">search_list</span><span class="plain">) {</span>
<span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_genre</span><span class="plain">)</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">G</span><span class="plain">, </span><span class="constant">GENRE_SEARCH_NEST_FOR_MTID</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">results</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The function Nests::search_for is used in <a href="#SP8">&#167;8</a>, 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>), 7/ed2 (<a href="7-ed2.html#SP4">&#167;4</a>), 7/ec (<a href="7-ec.html#SP3">&#167;3</a>).</p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Oftentimes, we want only the single best result, and won't even look at the
others:
</p>
<pre class="display">
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">,</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search_list</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_search_result</span><span class="plain">);</span>
<span class="functiontext">Nests::search_for</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">search_list</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">best</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">search_result</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">, </span><span class="reserved">inbuild_search_result</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Nests::better_result</span><span class="plain">(</span><span class="identifier">search_result</span><span class="plain">, </span><span class="identifier">best</span><span class="plain">))</span>
<span class="identifier">best</span><span class="plain"> = </span><span class="identifier">search_result</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">best</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-29 19:39:17 +03:00
</pre>
2020-03-11 02:21:09 +02:00
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function Nests::search_for_best is used in 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP8">&#167;8</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
2020-03-29 19:39:17 +03:00
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Where "better" is defined as follows. This innocent-looking function is
in fact critical to what Inbuild does. It uses tags on nests to prefer copies
in the Materials folder to those in the external nest, and to prefer those in
turn to copies in the internal nest; and within nests of equal importance,
it chooses the earliest hit among those which have the highest-precedence
semantic version numbers.
</p>
<pre class="display">
2020-03-11 02:21:09 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Nests::better_result</span><span class="plain">(</span><span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R1</span><span class="plain">, </span><span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain">) {</span>
2020-03-29 19:39:17 +03:00
<span class="comment">Something is better than nothing</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-29 19:39:17 +03:00
<span class="comment">Otherwise, a more important nest beats a less important nest</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">o1</span><span class="plain"> = </span><span class="functiontext">Nests::get_tag</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-&gt;</span><span class="element">nest</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">o2</span><span class="plain"> = </span><span class="functiontext">Nests::get_tag</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">-&gt;</span><span class="element">nest</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o1</span><span class="plain"> &lt; </span><span class="identifier">o2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o1</span><span class="plain"> &gt; </span><span class="identifier">o2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-03-29 19:39:17 +03:00
<span class="comment">Otherwise, a higher semantic version number beats a lower</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumbers::gt</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-&gt;</span><span class="element">copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="element">version</span><span class="plain">, </span><span class="identifier">R2</span><span class="plain">-&gt;</span><span class="element">copy</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">version</span><span class="plain">))</span>
2020-03-29 19:39:17 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
2020-03-29 19:39:17 +03:00
<span class="comment">Otherwise, better the devil we know</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 19:39:17 +03:00
<p class="endnote">The function Nests::better_result is used in <a href="#SP8">&#167;8</a>.</p>
2020-02-27 13:18:25 +02:00
<hr class="tocbar">
<ul class="toc"><li><a href="2-rqr.html">Back to 'Requirements'</a></li><li><i>(This section ends Chapter 2: Conceptual Framework.)</i></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>