inweb-bootstrap/docs/inweb/6-mkf.html
2020-04-17 10:07:57 +01:00

632 lines
88 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Makefiles</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Octagram184x184.png" width=72 height=72">
</a></h1>
<ul><li><a href="index.html"><span class="selectedlink">inweb</span></a></li>
</ul><h2>Foundation Module</h2><ul>
<li><a href="../foundation-module/index.html">foundation</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul><h2>Example Webs</h2><ul>
<li><a href="../goldbach/index.html">goldbach</a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
<li><a href="../eastertide/index.html">eastertide</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inweb"><img src="../github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inform/docs/index.html">inform</a></li>
<li><a href="../../../intest/docs/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Makefiles' generated by Inweb-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#6">Chapter 6: Extras</a></li><li><b>Makefiles</b></li></ul><p class="purpose">Constructing a suitable makefile for a simple inweb project.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This section offers just one function, which constructs a makefile by
following a "prototype".
</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">makefile_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">for_web</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">to_makefile</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">repeat_block</span><span class="plain">; </span><span class="comment"> a "repeatblock" body being scanned</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inside_block</span><span class="plain">; </span><span class="comment"> scanning a "repeatblock" into that text?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_line_was_blank</span><span class="plain">; </span><span class="comment"> used to suppress runs of multiple blank lines</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_commands</span><span class="plain">; </span><span class="comment"> permit the prototype to use special commands</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">repeat_scope</span><span class="plain">; </span><span class="comment"> during a repeat, either <code class="display"><span class="extract">MAKEFILE_TOOL_MOM</span></code> or <code class="display"><span class="extract">MAKEFILE_MODULE_MOM</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">repeat_tag</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">tools_dictionary</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">webs_dictionary</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">modules_dictionary</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">search_path</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">makefile_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Makefiles::write<button class="popup" onclick="togglePopup('usagePopup342')">...<span class="popuptext" id="usagePopup342">Usage of <b>Makefiles::write</b>:<br>Program Control - <a href="1-pc.html#SP7_1">&#167;7.1</a><br>The Analyser - <a href="3-ta.html#SP13">&#167;13</a></span></button></span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">prototype</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">makefile_state</span><span class="plain"> </span><span class="identifier">MS</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">for_web</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">repeat_block</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">inside_block</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">allow_commands</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">tools_dictionary</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP2">Dictionaries::new</a></span><span class="plain">(16, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">webs_dictionary</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP2">Dictionaries::new</a></span><span class="plain">(16, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">modules_dictionary</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP2">Dictionaries::new</a></span><span class="plain">(16, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">search_path</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">repeat_scope</span><span class="plain"> = -1;</span>
<span class="identifier">MS</span><span class="plain">.</span><span class="element">repeat_tag</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;(</span><span class="identifier">MS</span><span class="plain">.</span><span class="element">to_makefile</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="constant">ISO_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext"><a href="../foundation-module/3-em.html#SP2">Errors::fatal_with_file</a></span><span class="plain">(</span><span class="string">"unable to write tangled file"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"# This makefile was automatically written by inweb -makefile\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"# and is not intended for human editing\n\n"</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-tf.html#SP5">TextFiles::read</a></span><span class="plain">(</span><span class="identifier">prototype</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open prototype file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext"><a href="6-mkf.html#SP2">Makefiles::scan_makefile_line</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">MS</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="string">"Wrote makefile '%f' from script '%f'\n"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">prototype</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure makefile_state is accessed in 3/ti, 6/gs and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Makefiles::scan_makefile_line<button class="popup" onclick="togglePopup('usagePopup343')">...<span class="popuptext" id="usagePopup343">Usage of <b>Makefiles::scan_makefile_line</b>:<br><a href="6-mkf.html#SP1">&#167;1</a>, <a href="6-mkf.html#SP2_9">&#167;2.9</a>, <a href="6-mkf.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">makefile_state</span><span class="plain"> *</span><span class="identifier">MS</span><span class="plain"> = (</span><span class="reserved">makefile_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">to_makefile</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *#%c*"</span><span class="plain">)) { </span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; } </span><span class="comment"> Skip comment lines</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">allow_commands</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{repeat-tools-block:(%C*)} *"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Begin a repeat tool block</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{repeat-webs-block:(%C*)} *"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Begin a repeat web block</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{repeat-modules-block:(%C*)} *"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Begin a repeat module block</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{end-block} *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">End a repeat block</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">inside_block</span><span class="plain">) </span>&lt;<span class="cwebmacro">Deal with a line in a repeat block</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*){repeat-tools-span}(%c*?){end-span}(%c*)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Deal with a repeat span</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*){repeat-webs-span}(%c*?){end-span}(%c*)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Deal with a repeat web span</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*){repeat-modules-span}(%c*?){end-span}(%c*)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Deal with a repeat module span</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{identity-settings} *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Expand identity-settings</span> <span class="cwebmacronumber">2.10</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{platform-settings} *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Expand platform-settings</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{tool} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Declare a tool</span> <span class="cwebmacronumber">2.11</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{web} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Declare a web</span> <span class="cwebmacronumber">2.12</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *{module} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Declare a module</span> <span class="cwebmacronumber">2.13</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *{dependent-files} *"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Expand dependent-files</span> <span class="cwebmacronumber">2.14</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *{dependent-files-for-tool-alone} *(%C+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Expand dependent-files-for-tool-alone</span> <span class="cwebmacronumber">2.16</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *{dependent-files-for-tool-and-modules} *(%C+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Expand dependent-files-for-tool</span> <span class="cwebmacronumber">2.15</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) *{dependent-files-for-module} *(%C+)"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Expand dependent-files-for-module</span> <span class="cwebmacronumber">2.17</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
&lt;<span class="cwebmacro">And otherwise copy the line straight through</span> <span class="cwebmacronumber">2.18</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin a repeat tool block</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_TOOL_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat block</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin a repeat web block</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_WEB_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat block</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin a repeat module block</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_MODULE_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat block</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_1_1"></a><b>&#167;2.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin a repeat block</span> <span class="cwebmacronumber">2.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">inside_block</span><span class="plain">) </span><span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"nested repeat blocks are not allowed"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">inside_block</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_scope</span><span class="plain"> = </span><span class="identifier">marker</span><span class="plain">;</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_tag</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_block</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2_1">&#167;2.1</a>, <a href="6-mkf.html#SP2_2">&#167;2.2</a>, <a href="6-mkf.html#SP2_3">&#167;2.3</a>.</p>
<p class="inwebparagraph"><a id="SP2_4"></a><b>&#167;2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with a line in a repeat block</span> <span class="cwebmacronumber">2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_block</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_5"></a><b>&#167;2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">End a repeat block</span> <span class="cwebmacronumber">2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">inside_block</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"{endblock} without {repeatblock}"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">inside_block</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="6-mkf.html#SP4">Makefiles::repeat</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_block</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_scope</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_tag</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">repeat_block</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with a repeat span</span> <span class="cwebmacronumber">2.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_TOOL_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat span</span> <span class="cwebmacronumber">2.6.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with a repeat web span</span> <span class="cwebmacronumber">2.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_WEB_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat span</span> <span class="cwebmacronumber">2.6.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_8"></a><b>&#167;2.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with a repeat module span</span> <span class="cwebmacronumber">2.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_MODULE_MOM</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Begin a repeat span</span> <span class="cwebmacronumber">2.6.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_6_1"></a><b>&#167;2.6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin a repeat span</span> <span class="cwebmacronumber">2.6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="6-mkf.html#SP4">Makefiles::repeat</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">, </span><span class="identifier">marker</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"all"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2_6">&#167;2.6</a>, <a href="6-mkf.html#SP2_7">&#167;2.7</a>, <a href="6-mkf.html#SP2_8">&#167;2.8</a>.</p>
<p class="inwebparagraph"><a id="SP2_9"></a><b>&#167;2.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand platform-settings</span> <span class="cwebmacronumber">2.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">prototype</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/3-fln.html#SP2">Filenames::in</a></span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"platform-settings.mk"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">allow_commands</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-tf.html#SP5">TextFiles::read</a></span><span class="plain">(</span><span class="identifier">prototype</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open make settings file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext"><a href="6-mkf.html#SP2">Makefiles::scan_makefile_line</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">allow_commands</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_10"></a><b>&#167;2.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand identity-settings</span> <span class="cwebmacronumber">2.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"INWEB = "</span><span class="plain">); </span><span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pathname_slashed</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">path_to_inweb</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/Tangled/inweb\n"</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_intest</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP4">Pathnames::down</a></span><span class="plain">(</span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP7">Pathnames::up</a></span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"intest"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"INTEST = "</span><span class="plain">); </span><span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pathname_slashed</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">path_to_intest</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/Tangled/intest\n"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">for_web</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"MYNAME = %S\n"</span><span class="plain">, </span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP7">Pathnames::directory_name</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">for_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"ME = "</span><span class="plain">); </span><span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pathname_slashed</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">for_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_11"></a><b>&#167;2.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Declare a tool</span> <span class="cwebmacronumber">2.11</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_TOOL_MOM</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">tools_dictionary</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Declare something</span> <span class="cwebmacronumber">2.11.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_12"></a><b>&#167;2.12. </b><code class="display">
&lt;<span class="cwebmacrodefn">Declare a web</span> <span class="cwebmacronumber">2.12</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_WEB_MOM</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">webs_dictionary</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Declare something</span> <span class="cwebmacronumber">2.11.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_13"></a><b>&#167;2.13. </b><code class="display">
&lt;<span class="cwebmacrodefn">Declare a module</span> <span class="cwebmacronumber">2.13</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marker</span><span class="plain"> = </span><span class="constant">MAKEFILE_MODULE_MOM</span><span class="plain">;</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">modules_dictionary</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Declare something</span> <span class="cwebmacronumber">2.11.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_11_1"></a><b>&#167;2.11.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Declare something</span> <span class="cwebmacronumber">2.11.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%SLEAF = %S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%SWEB = %S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%SMAKER = $(%SWEB)/%S.mk\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%SX = $(%SWEB)/Tangled/%S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="2-tr.html#SP4">Reader::load_web_md</a></span><span class="plain">(</span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP5">Pathnames::from_text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]), </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">search_path</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">-&gt;</span><span class="element">module_tag</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[3]);</span>
<span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">-&gt;</span><span class="element">origin_marker</span><span class="plain"> = </span><span class="identifier">marker</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::create</a></span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::write_value</a></span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">Wm</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2_11">&#167;2.11</a>, <a href="6-mkf.html#SP2_12">&#167;2.12</a>, <a href="6-mkf.html#SP2_13">&#167;2.13</a>.</p>
<p class="inwebparagraph"><a id="SP2_14"></a><b>&#167;2.14. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand dependent-files</span> <span class="cwebmacronumber">2.14</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">for_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">for_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_15"></a><b>&#167;2.15. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand dependent-files-for-tool</span> <span class="cwebmacronumber">2.15</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">tools_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1])) {</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">tools_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">webs_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1])) {</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">webs_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Tool %S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"unknown tool to find dependencies for"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_16"></a><b>&#167;2.16. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand dependent-files-for-tool-alone</span> <span class="cwebmacronumber">2.16</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">tools_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1])) {</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">tools_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">webs_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1])) {</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">webs_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Tool %S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"unknown tool to find dependencies for"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_17"></a><b>&#167;2.17. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expand dependent-files-for-module</span> <span class="cwebmacronumber">2.17</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">modules_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1])) {</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">modules_dictionary</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="functiontext"><a href="6-mkf.html#SP3">Makefiles::pattern</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="element">contents_filename</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"unknown module to find dependencies for"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"-- module name: %S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_18"></a><b>&#167;2.18. </b><code class="display">
&lt;<span class="cwebmacrodefn">And otherwise copy the line straight through</span> <span class="cwebmacronumber">2.18</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">line</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">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">MS</span><span class="plain">-&gt;</span><span class="element">last_line_was_blank</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Makefiles::pathname_slashed<button class="popup" onclick="togglePopup('usagePopup344')">...<span class="popuptext" id="usagePopup344">Usage of <b>Makefiles::pathname_slashed</b>:<br><a href="6-mkf.html#SP2_10">&#167;2.10</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">PT</span><span class="plain">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">PT</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="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">PT</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\\ "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">PT</span><span class="plain">)</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Makefiles::pattern<button class="popup" onclick="togglePopup('usagePopup345')">...<span class="popuptext" id="usagePopup345">Usage of <b>Makefiles::pattern</b>:<br><a href="6-mkf.html#SP2_14">&#167;2.14</a>, <a href="6-mkf.html#SP2_15">&#167;2.15</a>, <a href="6-mkf.html#SP2_16">&#167;2.16</a>, <a href="6-mkf.html#SP2_17">&#167;2.17</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">patterns_done</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP2">Dictionaries::new</a></span><span class="plain">(16, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain">) </span>&lt;<span class="cwebmacro">Add pattern for file F, if not already given</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">source_file_for_section</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Add pattern for file F, if not already given</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add pattern for file F, if not already given</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/3-fln.html#SP6">Filenames::up</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP7">Pathnames::directory_name</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">leaf_pattern</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter %d*"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">, </span><span class="string">"Chapter*"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">leaf_pattern</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Appendix %C"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">, </span><span class="string">"Appendix*"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="../foundation-module/4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">, </span><span class="string">"%p/%S/*"</span><span class="plain">, </span><span class="functiontext"><a href="../foundation-module/3-pth.html#SP7">Pathnames::up</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">leaf_pattern</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/3-fln.html#SP8">Filenames::write_extension</a></span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP5">Dictionaries::find</a></span><span class="plain">(</span><span class="identifier">patterns_done</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext"><a href="../foundation-module/2-dct.html#SP9">Dictionaries::create_text</a></span><span class="plain">(</span><span class="identifier">patterns_done</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">), </span><span class="string">"got this"</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">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">'\\'</span><span class="plain">);</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="6-mkf.html#SP3">&#167;3</a> (twice).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And finally, the following handles repetitions both of blocks and of spans:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Makefiles::repeat<button class="popup" onclick="togglePopup('usagePopup346')">...<span class="popuptext" id="usagePopup346">Usage of <b>Makefiles::repeat</b>:<br><a href="6-mkf.html#SP2_5">&#167;2.5</a>, <a href="6-mkf.html#SP2_6_1">&#167;2.6.1</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">every_time</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">as_lines</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">suffix</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">makefile_state</span><span class="plain"> *</span><span class="identifier">MS</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">over</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">) {</span>
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">module</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">origin_marker</span><span class="plain"> == </span><span class="identifier">over</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"all"</span><span class="plain">)) || (</span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_tag</span><span class="plain">)))) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prefix</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">c</span><span class="plain">++ &gt; </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">every_time</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">prefix</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">matter</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">'\n'</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">as_lines</span><span class="plain">) {</span>
<span class="functiontext"><a href="6-mkf.html#SP2">Makefiles::scan_makefile_line</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">MS</span><span class="plain">);</span>
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">'@'</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">as_lines</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">line</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suffix</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">suffix</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 6: Extras.)</i></li><li><a href="6-gs.html">Continue with 'Git Support'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<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">
</main>
</body>
</html>