281 lines
44 KiB
HTML
281 lines
44 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Build Files</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/docs-src/Figures/Octagram184x184.png" width=72 height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../inweb/index.html">inweb</a></li>
|
|
</ul><h2>Foundation Module</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">foundation</span></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>
|
|
</ul><h2>External</h2><ul>
|
|
<li><a href="https://github.com/ganelson/inweb">github</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Build Files' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#8">Chapter 8: Literate Programming</a></li><li><b>Build Files</b></li></ul><p class="purpose">Manages the build metadata for an inweb project.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. About build files</a></li><li><a href="#SP5">§5. Bibliographic implications</a></li><li><a href="#SP7">§7. Advancing</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. About build files. </b>When we read a web, we look for a file in it called <code class="display"><span class="extract">build.txt</span></code>. If no such
|
|
file exists, we look for the same thing in the current working directory.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">BuildFiles::build_file_for_web<button class="popup" onclick="togglePopup('usagePopup515')">...<span class="popuptext" id="usagePopup515">Usage of <b>BuildFiles::build_file_for_web</b>:<br><a href="#SP5">§5</a>, <a href="#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</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="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-></span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"build.txt"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-tf.html#SP1">TextFiles::exists</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
|
|
<span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"build.txt"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-tf.html#SP1">TextFiles::exists</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The format of such a file is very simple: up to three text fields:
|
|
</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">build_file_data</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">prerelease_text</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">build_code</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">build_date</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">build_file_data</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure build_file_data is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Here's how to read in a build file:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="functiontext">BuildFiles::read<button class="popup" onclick="togglePopup('usagePopup516')">...<span class="popuptext" id="usagePopup516">Usage of <b>BuildFiles::read</b>:<br><a href="#SP5">§5</a>, <a href="#SP7">§7</a></span></button></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">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span>
|
|
<span class="identifier">bfd</span><span class="plain">.</span><span class="element">prerelease_text</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
|
|
<span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
|
|
<span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_date</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
|
|
<span class="functiontext"><a href="4-tf.html#SP5">TextFiles::read</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read build file"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
|
|
<span class="plain">&</span><span class="functiontext"><a href="#SP3">BuildFiles::build_file_helper</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &</span><span class="identifier">bfd</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::build_file_helper<button class="popup" onclick="togglePopup('usagePopup517')">...<span class="popuptext" id="usagePopup517">Usage of <b>BuildFiles::build_file_helper</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</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">state</span><span class="plain">) {</span>
|
|
<span class="reserved">build_file_data</span><span class="plain"> *</span><span class="identifier">bfd</span><span class="plain"> = (</span><span class="reserved">build_file_data</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</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="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="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Build Date: *(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="identifier">bfd</span><span class="plain">-></span><span class="element">build_date</span><span class="plain"> = </span><span class="functiontext"><a href="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="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="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Build Number: *(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="identifier">bfd</span><span class="plain">-></span><span class="element">build_code</span><span class="plain"> = </span><span class="functiontext"><a href="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="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="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Prerelease: *(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="identifier">bfd</span><span class="plain">-></span><span class="element">prerelease_text</span><span class="plain"> = </span><span class="functiontext"><a href="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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"can't parse build file line"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And here is how to write one:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::write<button class="popup" onclick="togglePopup('usagePopup518')">...<span class="popuptext" id="usagePopup518">Usage of <b>BuildFiles::write</b>:<br><a href="#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</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">text_stream</span><span class="plain"> </span><span class="identifier">vr_stream</span><span class="plain">;</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &</span><span class="identifier">vr_stream</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-str.html#SP24">Streams::open_to_file</a></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">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal_with_file</a></span><span class="plain">(</span><span class="string">"can't write build file"</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="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">prerelease_text</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Prerelease: %S\n"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">prerelease_text</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Build Date: %S\n"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_date</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Build Number: %S\n"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-str.html#SP34">Streams::close</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Bibliographic implications. </b>Whenever a web is read in by Inweb, its build file is looked at in order to
|
|
set some bibliographic data.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::set_bibliographic_data_for<button class="popup" onclick="togglePopup('usagePopup519')">...<span class="popuptext" id="usagePopup519">Usage of <b>BuildFiles::set_bibliographic_data_for</b>:<br>Web Structure - <a href="8-ws.html#SP5_3">§5.3</a></span></button></span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</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="functiontext"><a href="#SP1">BuildFiles::build_file_for_web</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain">) {</span>
|
|
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain"> = </span><span class="functiontext"><a href="#SP3">BuildFiles::read</a></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="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">prerelease_text</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="8-bdfw.html#SP7">Bibliographic::set_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Prerelease"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">prerelease_text</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="8-bdfw.html#SP7">Bibliographic::set_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Number"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_date</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="8-bdfw.html#SP7">Bibliographic::set_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Date"</span><span class="plain">, </span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_date</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>A little later on, i.e., once the Contents page has been read, we want to
|
|
synthesize the semantic version number for the project. Note that this is
|
|
called even if no build file had ever been found, so it's quite legal for
|
|
the Contents page to specify all of this.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">If no error occurs, then the expansion <code class="display"><span class="extract">[[Semantic Version Number]]</span></code> is
|
|
guaranteed to produce a semver-legal version number.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::deduce_semver<button class="popup" onclick="togglePopup('usagePopup520')">...<span class="popuptext" id="usagePopup520">Usage of <b>BuildFiles::deduce_semver</b>:<br>Web Structure - <a href="8-ws.html#SP5_3">§5.3</a></span></button></span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Semantic Version Number"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">s</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Prerelease"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">, </span><span class="string">"-%S"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">b</span><span class="plain"> = </span><span class="functiontext"><a href="8-bdfw.html#SP6">Bibliographic::get_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Number"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">b</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">, </span><span class="string">"+%S"</span><span class="plain">, </span><span class="identifier">b</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">WS</span><span class="plain">-></span><span class="element">version_number</span><span class="plain"> = </span><span class="functiontext"><a href="7-vn.html#SP7">VersionNumbers::from_text</a></span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="7-vn.html#SP4">VersionNumbers::is_null</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-></span><span class="element">version_number</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal_with_text</a></span><span class="plain">(</span>
|
|
<span class="string">"Combined version '%S' does not comply with the semver standard"</span><span class="plain">,</span>
|
|
<span class="identifier">combined</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext"><a href="8-bdfw.html#SP7">Bibliographic::set_datum</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Semantic Version Number"</span><span class="plain">, </span><span class="identifier">combined</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">combined</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Advancing. </b>We update the build date to today and, if supplied, also increment the build
|
|
number if we find that the date has changed.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance_for_web<button class="popup" onclick="togglePopup('usagePopup521')">...<span class="popuptext" id="usagePopup521">Usage of <b>BuildFiles::advance_for_web</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</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="functiontext"><a href="#SP1">BuildFiles::build_file_for_web</a></span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain">) </span><span class="functiontext"><a href="#SP7">BuildFiles::advance</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="3-em.html#SP2">Errors::fatal</a></span><span class="plain">(</span><span class="string">"web has no build file"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance<button class="popup" onclick="togglePopup('usagePopup522')">...<span class="popuptext" id="usagePopup522">Usage of <b>BuildFiles::advance</b>:<br>none</span></button></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">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain"> = </span><span class="functiontext"><a href="#SP3">BuildFiles::read</a></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="#SP8">BuildFiles::dated_today</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_date</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP9">BuildFiles::increment</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">.</span><span class="element">build_code</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="#SP4">BuildFiles::write</a></span><span class="plain">(</span><span class="identifier">bfd</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>The standard date format we use is "26 February 2018". If the contents of
|
|
<code class="display"><span class="extract">dateline</span></code> match today's date in this format, we return <code class="display"><span class="extract">TRUE</span></code>; otherwise we
|
|
rewrite <code class="display"><span class="extract">dateline</span></code> to today and return <code class="display"><span class="extract">FALSE</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildFiles::dated_today<button class="popup" onclick="togglePopup('usagePopup523')">...<span class="popuptext" id="usagePopup523">Usage of <b>BuildFiles::dated_today</b>:<br><a href="#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">dateline</span><span class="plain">) {</span>
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span>
|
|
<span class="string">"July"</span><span class="plain">, </span><span class="string">"August"</span><span class="plain">, </span><span class="string">"September"</span><span class="plain">, </span><span class="string">"October"</span><span class="plain">, </span><span class="string">"November"</span><span class="plain">, </span><span class="string">"December"</span><span class="plain"> };</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">today</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">today</span><span class="plain">, </span><span class="string">"%d %s %d"</span><span class="plain">,</span>
|
|
<span class="identifier">the_present</span><span class="plain">-></span><span class="identifier">tm_mday</span><span class="plain">, </span><span class="identifier">monthname</span><span class="plain">[</span><span class="identifier">the_present</span><span class="plain">-></span><span class="identifier">tm_mon</span><span class="plain">], </span><span class="identifier">the_present</span><span class="plain">-></span><span class="identifier">tm_year</span><span class="plain">+1900);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::ne</a></span><span class="plain">(</span><span class="identifier">dateline</span><span class="plain">, </span><span class="identifier">today</span><span class="plain">)) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">dateline</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">dateline</span><span class="plain">, </span><span class="identifier">today</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">today</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>Traditional Inform build codes are four-character, e.g., <code class="display"><span class="extract">3Q27</span></code>. Here, we
|
|
read such a code and increase it by one. The two-digit code at the back is
|
|
incremented, but rolls around from <code class="display"><span class="extract">99</span></code> to <code class="display"><span class="extract">01</span></code>, in which case the letter is
|
|
advanced, except that <code class="display"><span class="extract">I</span></code> and <code class="display"><span class="extract">O</span></code> are skipped, and if the letter passes <code class="display"><span class="extract">Z</span></code>
|
|
then it rolls back around to <code class="display"><span class="extract">A</span></code> and the initial digit is incremented.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This allows for 21384 distinct build codes, enough to use one each day for
|
|
some 58 years.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::increment<button class="popup" onclick="togglePopup('usagePopup524')">...<span class="popuptext" id="usagePopup524">Usage of <b>BuildFiles::increment</b>:<br><a href="#SP7">§7</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</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="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) != </span><span class="constant">4</span><span class="plain">) </span><span class="functiontext"><a href="3-em.html#SP7">Errors::with_text</a></span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">0</span><span class="plain">) - </span><span class="character">'0'</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">M1</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">2</span><span class="plain">) - </span><span class="character">'0'</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">M2</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">3</span><span class="plain">) - </span><span class="character">'0'</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="constant">0</span><span class="plain">) || (</span><span class="identifier">N</span><span class="plain"> > </span><span class="constant">9</span><span class="plain">) || (</span><span class="identifier">L</span><span class="plain"> < </span><span class="character">'A'</span><span class="plain">) || (</span><span class="identifier">L</span><span class="plain"> > </span><span class="character">'Z'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">M1</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">M1</span><span class="plain"> > </span><span class="constant">9</span><span class="plain">) || (</span><span class="identifier">M2</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">M2</span><span class="plain"> > </span><span class="constant">9</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="3-em.html#SP7">Errors::with_text</a></span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">M2</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">M2</span><span class="plain"> == </span><span class="constant">10</span><span class="plain">) { </span><span class="identifier">M2</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">M1</span><span class="plain">++; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">M1</span><span class="plain"> == </span><span class="constant">10</span><span class="plain">) { </span><span class="identifier">M1</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">M2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">++; }</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain"> == </span><span class="character">'I'</span><span class="plain">) || (</span><span class="identifier">L</span><span class="plain"> == </span><span class="character">'O'</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> > </span><span class="character">'Z'</span><span class="plain">) { </span><span class="identifier">L</span><span class="plain"> = </span><span class="character">'A'</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="constant">10</span><span class="plain">) </span><span class="functiontext"><a href="3-em.html#SP7">Errors::with_text</a></span><span class="plain">(</span><span class="string">"build code overflowed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%d%c%d%d"</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">M1</span><span class="plain">, </span><span class="identifier">M2</span><span class="plain">);</span>
|
|
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Build code advanced to %S\n"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</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><a href="8-wm.html">Back to 'Web Modules'</a></li><li><i>(This section ends Chapter 8: Literate Programming.)</i></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>
|
|
|