inweb-bootstrap/docs/eastertide/S-rtd.html

336 lines
31 KiB
HTML
Raw Normal View History

2020-04-15 22:45:08 +00:00
<!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">
2020-04-16 22:51:03 +00:00
<!--Weave of 'Reporting the Date' generated by Inweb-->
2020-04-15 22:45:08 +00:00
<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>&#167;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>&#167;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>
&lt;<span class="cwebmacro">Read the command line</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the report to the console</span> <span class="cwebmacronumber">2.1</span>&gt;<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>&#167;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">
&lt;<span class="cwebmacrodefn">Write the report to the console</span> <span class="cwebmacronumber">2.1</span>&gt; =
</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">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;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>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the command line</span> <span class="cwebmacronumber">2.3</span>&gt; =
</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">, &amp;</span><span class="functiontext"><a href="S-rtd.html#SP4">Main::switch</a></span><span class="plain">, &amp;</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">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;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>&#167;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">&#167;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">&#167;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>&lt;<span class="cwebmacro">Process calendar file</span> <span class="cwebmacronumber">4.1</span>&gt;<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>&#167;4.1. </b>We will read in the calendar file as soon as it is mentioned:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Process calendar file</span> <span class="cwebmacronumber">4.1</span>&gt; =
</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">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;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">&#167;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>&#167;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">&#167;4</a>, <a href="S-rtd.html#SP5">&#167;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"> &lt; </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>&#167;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>&#167;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">&#167;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">-&gt;</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>&#167;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">&#167;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">-&gt;</span><span class="element">year</span><span class="plain">, &amp;</span><span class="identifier">d</span><span class="plain">, &amp;</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">-&gt;</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">-&gt;</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>