336 lines
31 KiB
HTML
336 lines
31 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>Reporting the Date</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="../inweb/index.html">inweb</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="index.html"><span class="selectedlink">eastertide</span></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 'Reporting the Date' generated by 7-->
|
||
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">Eastertide</a></li><li><b>Reporting the Date</b></li></ul><p class="purpose">This is really the whole Eastertide program, in a single section.</p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>This utility, or perhaps futility, is a minimal example of the use of the
|
||
|
Foundation library, which comes supplied with <a href="../inweb/index.html" class="internal">inweb</a> for the benefit
|
||
|
of C programs wanting to use it. We will do everything in an unnecessarily
|
||
|
fancy way, just to give the tires a kick.
|
||
|
</p>
|
||
|
|
||
|
<p class="inwebparagraph">Any program using Foundation must define this constant:
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<pre class="definitions">
|
||
|
<span class="definitionkeyword">define</span> <span class="constant">PROGRAM_NAME</span><span class="plain"> </span><span class="string">"eastertide"</span>
|
||
|
</pre>
|
||
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The <code class="display"><span class="extract">main</span></code> routine must start and end Foundation, and is not allowed to
|
||
|
do much after that; but it is allowed to ask if error messages were generated,
|
||
|
so that it can return conventional Unix return values 0 (okay) or 1 (not okay).
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/1-fm.html#SP8">Foundation::start</a></span><span class="plain">();</span>
|
||
|
|
||
|
<<span class="cwebmacro">Read the command line</span> <span class="cwebmacronumber">2.3</span>><span class="plain">;</span>
|
||
|
<<span class="cwebmacro">Write the report to the console</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
||
|
|
||
|
<span class="functiontext"><a href="../foundation-module/1-fm.html#SP9">Foundation::end</a></span><span class="plain">();</span>
|
||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/3-em.html#SP1">Errors::have_occurred</a></span><span class="plain">()) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
||
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||
|
<span class="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b>The general scheme here is that we read the command line to work out which
|
||
|
the user is interested in, and store those in memory; but eventually we will
|
||
|
actually report on them, thus. <code class="display"><span class="extract">STDOUT</span></code> is the "text stream" for standard
|
||
|
output, i.e., writing to it will print to the Terminal or similar console.
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<p class="macrodefinition"><code class="display">
|
||
|
<<span class="cwebmacrodefn">Write the report to the console</span> <span class="cwebmacronumber">2.1</span>> =
|
||
|
</code></p>
|
||
|
|
||
|
|
||
|
<pre class="displaydefn">
|
||
|
<span class="functiontext"><a href="S-rtd.html#SP9">Main::report_on_years</a></span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">);</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="endnote">This code is used in <a href="S-rtd.html#SP2">§2</a>.</p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b>All this program does is to print the date of Easter on any years requested,
|
||
|
but we'll give it some command-line options anyway. Foundation will add also
|
||
|
<code class="display"><span class="extract">-help</span></code> and a few others to the mix.
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<pre class="definitions">
|
||
|
<span class="definitionkeyword">enum</span> <span class="constant">CALENDAR_FILE_CLSW</span>
|
||
|
<span class="definitionkeyword">enum</span> <span class="constant">QUALIFYING_CLSG</span>
|
||
|
<span class="definitionkeyword">enum</span> <span class="constant">VERBOSE_CLSW</span>
|
||
|
<span class="definitionkeyword">enum</span> <span class="constant">AMERICAN_CLSW</span>
|
||
|
</pre>
|
||
|
<p class="inwebparagraph"><a id="SP2_3"></a><b>§2.3. </b><code class="display">
|
||
|
<<span class="cwebmacrodefn">Read the command line</span> <span class="cwebmacronumber">2.3</span>> =
|
||
|
</code></p>
|
||
|
|
||
|
|
||
|
<pre class="displaydefn">
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP14">CommandLine::declare_heading</a></span><span class="plain">(</span>
|
||
|
<span class="identifier">L</span><span class="string">"eastertide: an Easter date calculator\n\n"</span>
|
||
|
<span class="identifier">L</span><span class="string">"usage: eastertide [OPTIONS] year1 year2 ...\n"</span><span class="plain">);</span>
|
||
|
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP5">CommandLine::declare_switch</a></span><span class="plain">(</span><span class="constant">CALENDAR_FILE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"calendar-file"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
|
||
|
<span class="identifier">L</span><span class="string">"specify file X as a list of year requests, one per line"</span><span class="plain">);</span>
|
||
|
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP5">CommandLine::begin_group</a></span><span class="plain">(</span><span class="constant">QUALIFYING_CLSG</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"for qualifying the output"</span><span class="plain">);</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP6">CommandLine::declare_boolean_switch</a></span><span class="plain">(</span><span class="constant">VERBOSE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"verbose"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
|
||
|
<span class="identifier">L</span><span class="string">"print output verbosely"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP6">CommandLine::declare_boolean_switch</a></span><span class="plain">(</span><span class="constant">AMERICAN_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"american"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
|
||
|
<span class="identifier">L</span><span class="string">"print dates in American MM/DD format"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP5">CommandLine::end_group</a></span><span class="plain">();</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-cla.html#SP8">CommandLine::read</a></span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &</span><span class="functiontext"><a href="S-rtd.html#SP4">Main::switch</a></span><span class="plain">, &</span><span class="functiontext"><a href="S-rtd.html#SP4">Main::bareword</a></span><span class="plain">);</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="endnote">This code is used in <a href="S-rtd.html#SP2">§2</a>.</p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>That results in dialogue like the following:
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="plain"> 2020</span>
|
||
|
<span class="plain">12/4/2020</span>
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="identifier"> -help</span>
|
||
|
<span class="plain">eastertide: an Easter date calculator</span>
|
||
|
|
||
|
<span class="plain">usage: eastertide [OPTIONS] year1 year2 ...</span>
|
||
|
|
||
|
<span class="plain">-calendar-file X specify file X as a list of year requests, one per line</span>
|
||
|
|
||
|
<span class="plain">for qualifying the output:</span>
|
||
|
<span class="plain"> -american print dates in American MM/DD format (default is -no-american)</span>
|
||
|
<span class="plain"> -verbose print output verbosely (default is -no-verbose)</span>
|
||
|
|
||
|
<span class="plain">-at X specify that this tool is installed at X</span>
|
||
|
<span class="plain">-crash intentionally crash on internal errors, for backtracing</span>
|
||
|
<span class="plain">-fixtime pretend the time is 11 a.m. on 28 March 2016 for testing</span>
|
||
|
<span class="plain">-help print this help information</span>
|
||
|
<span class="plain">-log X write the debugging log to include diagnostics on X</span>
|
||
|
<span class="plain">-version print out version number</span>
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="identifier"> -verbose</span><span class="plain"> 2021 2022</span>
|
||
|
<span class="plain">Easter in 2021 falls on 4/4.</span>
|
||
|
<span class="plain">Easter in 2022 falls on 17/4.</span>
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="plain"> 1496</span>
|
||
|
<span class="plain">eastertide: Gregorian calendar only valid from 1582</span>
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="plain"> 1685 1750</span>
|
||
|
<span class="plain">22/4/1685</span>
|
||
|
<span class="plain">29/3/1750</span>
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="identifier"> -calendar-file</span><span class="plain"> cal.txt</span>
|
||
|
<span class="plain">eastertide: cal.txt, line 2: not a year: '1791b'</span>
|
||
|
<span class="plain">15/4/1770</span>
|
||
|
<span class="plain">15/4/1827</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>So let's get back to how this is done. The Foundation function <a href="../foundation-module/3-cla.html#SP8" class="internal">CommandLine::read</a>
|
||
|
calls our function <code class="display"><span class="extract">Main::switch</span></code> when any of our three switches is used
|
||
|
(we don't need to handle the ones Foundation added, only our own); and
|
||
|
<code class="display"><span class="extract">Main::bareword</span></code> for any other words given on the command line. For example,
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="element">$</span><span class="plain"> </span><span class="functiontext">eastertide</span><span class="identifier"> -american -calendar-file</span><span class="plain"> cal.txt 1982 2007</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph">...results in two calls to <code class="display"><span class="extract">Main::switch</span></code>, then two to <code class="display"><span class="extract">Main::bareword</span></code>.
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">american_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||
|
|
||
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::bareword<button class="popup" onclick="togglePopup('usagePopup0')">...<span class="popuptext" id="usagePopup0">Usage of <b>Main::bareword</b>:<br><a href="S-rtd.html#SP2_3">§2.3</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</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="functiontext"><a href="S-rtd.html#SP6">Main::request</a></span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
||
|
<span class="plain">}</span>
|
||
|
|
||
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::switch<button class="popup" onclick="togglePopup('usagePopup1')">...<span class="popuptext" id="usagePopup1">Usage of <b>Main::switch</b>:<br><a href="S-rtd.html#SP2_3">§2.3</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</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">switch</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
|
||
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERBOSE_CLSW:</span><span class="plain"> </span><span class="identifier">verbose_mode</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">AMERICAN_CLSW:</span><span class="plain"> </span><span class="identifier">american_mode</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALENDAR_FILE_CLSW:</span><span class="plain"> </span><<span class="cwebmacro">Process calendar file</span> <span class="cwebmacronumber">4.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§4.1. </b>We will read in the calendar file as soon as it is mentioned:
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<p class="macrodefinition"><code class="display">
|
||
|
<<span class="cwebmacrodefn">Process calendar file</span> <span class="cwebmacronumber">4.1</span>> =
|
||
|
</code></p>
|
||
|
|
||
|
|
||
|
<pre class="displaydefn">
|
||
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/3-fln.html#SP3">Filenames::from_text</a></span><span class="plain">(</span><span class="identifier">arg</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">F</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open calendar file"</span><span class="plain">,</span>
|
||
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext"><a href="S-rtd.html#SP5">Main::calendar_line</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="endnote">This code is used in <a href="S-rtd.html#SP4">§4</a>.</p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>To make this a little more gratuitous, we'll give calendar files some
|
||
|
syntax. The following function is called on each line in turn; we're going
|
||
|
to trim white space, ignore blank lines, and also ignore any line beginning
|
||
|
withn a <code class="display"><span class="extract">#</span></code> as being a comment.
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::calendar_line<button class="popup" onclick="togglePopup('usagePopup2')">...<span class="popuptext" id="usagePopup2">Usage of <b>Main::calendar_line</b>:<br><a href="S-rtd.html#SP4_1">§4.1</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">state</span><span class="plain">) {</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
|
||
|
<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">return</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_first_char</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'#'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||
|
<span class="functiontext"><a href="S-rtd.html#SP6">Main::request</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="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>And with that done, we can process a request for a year, which comes from
|
||
|
either the command lihe (in which case <code class="display"><span class="extract">tfp</span></code> here is null), or from the
|
||
|
calendar file (in which case it remembers the filename and line number).
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::request<button class="popup" onclick="togglePopup('usagePopup3')">...<span class="popuptext" id="usagePopup3">Usage of <b>Main::request</b>:<br><a href="S-rtd.html#SP4">§4</a>, <a href="S-rtd.html#SP5">§5</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">year</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">int</span><span class="plain"> </span><span class="identifier">bad_digit</span><span class="plain"> = </span><span class="constant">FALSE</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">year</span><span class="plain">)</span>
|
||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="../foundation-module/4-chr.html#SP1">Characters::isdigit</a></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="constant">FALSE</span><span class="plain">)</span>
|
||
|
<span class="identifier">bad_digit</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="identifier">bad_digit</span><span class="plain">) {</span>
|
||
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
|
||
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"not a year: '%S'"</span><span class="plain">, </span><span class="identifier">year</span><span class="plain">);</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-em.html#SP5">Errors::in_text_file_S</a></span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
|
||
|
<span class="reserved">return</span><span class="plain">;</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">Y</span><span class="plain"> = </span><span class="functiontext"><a href="../foundation-module/4-sm.html#SP7">Str::atoi</a></span><span class="plain">(</span><span class="identifier">year</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">Y</span><span class="plain"> < </span><span class="constant">1582</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">"Gregorian calendar only valid from 1582"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
|
||
|
<span class="reserved">return</span><span class="plain">;</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="functiontext"><a href="S-rtd.html#SP8">Main::new_year</a></span><span class="plain">(</span><span class="identifier">Y</span><span class="plain">);</span>
|
||
|
<span class="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Now it's time to actually store a request. There are many simpler ways to
|
||
|
do this, but we want to demonstrate Foundation's objects system in action,
|
||
|
so we'll wrap each year supplied in an object. First, we have to define an
|
||
|
ID constant for this new class of object, and use a macro which causes
|
||
|
Foundation to generate the necessary handling functions:
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<pre class="definitions">
|
||
|
<span class="definitionkeyword">enum</span> <span class="constant">year_request_MT</span>
|
||
|
</pre>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">year_request</span><span class="plain">)</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>Now we should define the rather unnecessary structure itself, and then
|
||
|
a sort of constructor function. We won't need a destructor: we will never
|
||
|
destroy the years.
|
||
|
</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">year_request</span><span class="plain"> {</span>
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">year</span><span class="plain">;</span>
|
||
|
<span class="constant">MEMORY_MANAGEMENT</span>
|
||
|
<span class="plain">} </span><span class="reserved">year_request</span><span class="plain">;</span>
|
||
|
|
||
|
<span class="reserved">year_request</span><span class="plain"> *</span><span class="functiontext">Main::new_year<button class="popup" onclick="togglePopup('usagePopup4')">...<span class="popuptext" id="usagePopup4">Usage of <b>Main::new_year</b>:<br><a href="S-rtd.html#SP6">§6</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">Y</span><span class="plain">) {</span>
|
||
|
<span class="reserved">year_request</span><span class="plain"> *</span><span class="identifier">YR</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">year_request</span><span class="plain">);</span>
|
||
|
<span class="identifier">YR</span><span class="plain">-></span><span class="element">year</span><span class="plain"> = </span><span class="identifier">Y</span><span class="plain">;</span>
|
||
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">YR</span><span class="plain">;</span>
|
||
|
<span class="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<p class="endnote">The structure year_request is private to this section.</p>
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>We can't spin this out much longer, though... This is the actually
|
||
|
functional part of the program, and even so, it only calls a routine
|
||
|
in Foundation. (See <a href="../foundation-module/3-tm.html#SP3" class="internal">Time::easter</a>.)
|
||
|
</p>
|
||
|
|
||
|
<pre class="display">
|
||
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::report_on_years<button class="popup" onclick="togglePopup('usagePopup5')">...<span class="popuptext" id="usagePopup5">Usage of <b>Main::report_on_years</b>:<br><a href="S-rtd.html#SP2_1">§2.1</a></span></button></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="reserved">year_request</span><span class="plain"> *</span><span class="identifier">YR</span><span class="plain">;</span>
|
||
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">YR</span><span class="plain">, </span><span class="reserved">year_request</span><span class="plain">) {</span>
|
||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">;</span>
|
||
|
<span class="functiontext"><a href="../foundation-module/3-tm.html#SP3">Time::easter</a></span><span class="plain">(</span><span class="identifier">YR</span><span class="plain">-></span><span class="element">year</span><span class="plain">, &</span><span class="identifier">d</span><span class="plain">, &</span><span class="identifier">m</span><span class="plain">);</span>
|
||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">american_mode</span><span class="plain">) { </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">d</span><span class="plain">; </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">; </span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">; }</span>
|
||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">verbose_mode</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Easter in %d falls on %d/%d.\n"</span><span class="plain">, </span><span class="identifier">YR</span><span class="plain">-></span><span class="element">year</span><span class="plain">, </span><span class="identifier">d</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">);</span>
|
||
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d/%d/%d\n"</span><span class="plain">, </span><span class="identifier">d</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">YR</span><span class="plain">-></span><span class="element">year</span><span class="plain">);</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="plain">}</span>
|
||
|
</pre>
|
||
|
|
||
|
<p class="inwebparagraph"></p>
|
||
|
|
||
|
<!--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>
|
||
|
|