build missing HTML files for entries

Setup a simple topnav for missing HTML files for entries.

Added `bin/gen-other-html.sh` to build entry HTML files from
markdown other than README.md to index.html HTML files.

Fixed duplicate link text in `2020/ferguson1/gameplay.md`.

Improved `inc/md2html.cfg` to support building the missing HTML
files for entries.

Added `make gen_other_html` to top level Makefile.
Added `make gen_other_html` to `make quick_www` and `make www`.

Fixed inventory links for year level index.html files.
Changed `bin/output-year-index.sh` VERSION from "1.0.1 2024-02-23"
to "1.1 2024-02-27".

Added missing lines in `manifest.numbers`.  Update the affected
`.entry.json` files.

The manifest (in both `manifest.numbers` and the collection of
manifests from of all entry `.entry.json` files) now match.  Errors
from `make verify_entry_files` will now abort both `make quick_www`
and `make www` rules in the top level `Makefile`.

Changed markdown files in manifest to have an _inventory_order_ of
_2000000000_ so that the `index.html` file will usually appear at
the start of the _Secondary files_ set for the "#inventory" section
of an entry's `index.html` file.

Changed compressed tar files (files that end in _.tar.bz2_) in
manifest to have an _inventory_order_ of _100000_ so that these
files will usually appear at the end of the _Primary files_ set for
the "#inventory" section of an entry's `index.html` file.

Added 'Jump to top` link above the _Primary files_ section.
Changed `bin/output-index-inventory.sh` VERSION from "1.1.1 2024-02-23"
to "1.2 2024-02-27".

Updated HTML files to perform the above via `make www`.
This commit is contained in:
Landon Curt Noll committed 2024-02-27 22:36:20 -08:00
1 parent 7babf792e4
commit 9d3438fb88
718 files changed
+17515 -4084

No files matched your search

+8 -8
View File
@@ -9,14 +9,6 @@
{ "author_handle" : "Frans_van_Dorsselaer" }
],
"manifest" : [
{
"file_path" : "index.html",
"inventory_order" : 10,
"OK_to_edit" : false,
"display_as" : "html",
"display_via_github" : false,
"entry_text" : "entry home page"
},
{
"file_path" : "dorssel.c",
"inventory_order" : 20,
@@ -65,6 +57,14 @@
"display_via_github" : false,
"entry_text" : "download entry source"
},
{
"file_path" : "index.html",
"inventory_order" : 2000000000,
"OK_to_edit" : false,
"display_as" : "html",
"display_via_github" : false,
"entry_text" : "entry home page"
},
{
"file_path" : ".entry.json",
"inventory_order" : 4294967295,
+307
View File
@@ -0,0 +1,307 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- START: two lines up starts content from: inc/top.default.html -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- END: this line ends content from: inc/top.default.html -->
<!-- -->
<!-- The original markdown content was formed by the tool: bin/gen-other-html.sh -->
<!-- The HTML was converted from markdown by the tool: bin/md2html.sh -->
<!-- -->
<!-- START: this line starts content from: inc/head.default.html -->
<head>
<link rel="stylesheet" href="../../ioccc.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>The International Obfuscated C Code Contest</title>
<meta name="description" content="dorssel.md for 1998/dorssel">
<meta name="keywords" content="IOCCC, 1998/dorssel, dorssel.md">
</head>
<!-- END: this line ends content from: inc/head.default.html -->
<!-- START: this line starts content from: inc/body.default.html -->
<body>
<!-- END: this line ends content from: inc/body.default.html -->
<!-- START: this line starts content from: inc/header.default.html -->
<div class="header">
<img src="../../png/ioccc.png" alt="IOCCC image by Matt Zucker" width=300 height=110>
<h1>The International Obfuscated C Code Contest</h1>
<h2>dorssel.md for 1998/dorssel</h2>
</div>
<!-- END: this line ends content from: inc/header.default.html -->
<!-- START: this line starts content from: inc/topnav.up2index.html -->
<div class="topnav">
<a class="Left" href="index.html">&uarr; jump to index.html &uarr;</a>
</div>
<!-- END: this line ends content from: inc/topnav.up2index.html -->
<!-- START: this line starts content from: inc/begin-row.default.html -->
<div class="row">
<!-- END: this line ends content from: inc/begin-row.default.html -->
<!-- START: this line starts content from: inc/begin-leftcolumn.default.html -->
<div class="leftcolumn">
<!-- END: this line ends content from: inc/begin-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/sidenav.default.html -->
<div class="sidenav">
<a href="#content">Jump to contents</a>
</div>
<hr>
<div class="sidenav">
<a href="../../index.html">IOCCC Home</a>
<a href="../../years.html">Winning Entries</a>
<a href="../../authors.html">People who have won</a>
</div>
<hr>
<div class="sidenav">
<a href="../../news.html">IOCCC News</a>
<a href="../../faq.html#submit">How to enter the IOCCC</a>
<a href="../../faq.html">FAQ</a>
</div>
<hr>
<div class="sidenav">
<a href="../../bugs.html">Bugs &amp; (mis)features</a>
<a href="../../faq.html#fix_an_entry">Fixing IOCCC entries</a>
<a href="../../faq.html#fix_web_site">Fixing the web site</a>
<a href="../../faq.html#fix_author">Fixing author info</a>
<a href="../../thanks-for-help.html">Thanks for the help</a>
</div>
<hr>
<div class="sidenav">
<a href="../../judges.html">The IOCCC Judges</a>
<a href="../../contact.html">Contacting the IOCCC</a>
</div>
<hr>
<div class="sidenav">
<a href="#top">Jump to top</a>
</div>
<!-- END: this line ends content from: inc/sidenav.default.html -->
<!-- START: this line starts content from: inc/end-leftcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-rightcolumn.default.html -->
<div class="rightcolumn">
<!-- END: this line ends content from: inc/begin-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/before-content.default.html -->
<a name="content"></a>
<!-- END: this line ends content from: inc/before-content.default.html -->
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<h1 id="information-about-this-entry">Information about this entry</h1>
<p>Morse codes for letters and digits use sequences of 1 to 5
(inclusive) Morse symbols (denoted as <code>.</code> or <code>-</code>),
e.g.</p>
<pre><code>E .
Z --..
3 ...--</code></pre>
<p>(BTW: digits always have 5 symbols, letters 1 to 4. I didn’t use this
fact.)</p>
<p>Of course we can encode these symbols with bits in a byte. I chose
<code>-</code> to be a bit set to 0, <code>.</code> to be a bit set to
1. Characters in C are at least 8 bits, but they are either signed or
unsigned. To be portable, I’ve used only values from 0 to 127
(inclusive) (both in the encoding of Morse codes, as well as in
subexpressions in the program). Hence we can use type <code>char</code>
(using <code>unsigned char</code> for an extra bit would have made the
source code excessively large ;-)</p>
<p>The least significant bit contains the first symbol of a Morse code,
so we have</p>
<pre><code>E &gt; 0......1
Z &gt; 0...1100
3 &gt; 0..00111</code></pre>
<p>The dots still have to be determined. But we also need to encode the
length of the sequence. Since there are only 4 different kind of
lengths, two bits would suffice, e.g.</p>
<pre><code>E &gt; 000....1
Z &gt; 010.1100
3 &gt; 01100111</code></pre>
<p>That means bits 6 and 5 set to 00 is length 1, set to 01 is length 2,
etc. But this would mean that we would have to extract the length into a
counter before shifting out each symbol, such as</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>length <span class="op">=</span> <span class="op">(</span>encoding <span class="op">&amp;</span> <span class="dv">96</span><span class="op">)</span> <span class="op">&gt;&gt;</span> <span class="dv">5</span><span class="op">;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> putchar<span class="op">(</span>encoding <span class="op">&amp;</span> <span class="dv">1</span> <span class="op">?</span> <span class="ch">&#39;-&#39;</span> <span class="op">:</span> <span class="ch">&#39;.&#39;</span><span class="op">);</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a> encoding <span class="op">&gt;&gt;=</span> <span class="dv">1</span><span class="op">;</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span>length<span class="op">--);</span></span></code></pre></div>
<p>We can also use the remaining bits to <em>include</em> the
counter</p>
<pre><code>length 1: 00000.1x E &gt; 00000.11
length 2: 0000.1xx
length 3: 000.1xxx
length 4: 00.1xxxx Z &gt; 00.11100
length 5: 0.1xxxxx 3 &gt; 0.100111</code></pre>
<p>with 1 bit still to be chosen freely (let’s assume it is 0). Now we
can do</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a> putchar<span class="op">(</span>encoding <span class="op">&amp;</span> <span class="dv">1</span> <span class="op">?</span> <span class="ch">&#39;-&#39;</span> <span class="op">:</span> <span class="ch">&#39;.&#39;</span><span class="op">);</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a> encoding <span class="op">&gt;&gt;=</span> <span class="dv">1</span><span class="op">;</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span>encoding <span class="op">&gt;</span> <span class="dv">1</span><span class="op">);</span></span></code></pre></div>
<p>As you see, the encoded Morse sequence can be the counter itself. But
this is not very pleasant, as some Morse sequences will end up having an
ASCII value &lt; 32, i.e. they will be control codes. This would make
the initializing (encoding) string awkward. Hence I came up with the
following</p>
<pre><code>length 1: 0010010x E &gt; 00100101 (= &#39;%&#39;)
length 2: 001010xx
length 3: 00110xxx
length 4: 0100xxxx Z &gt; 01001100 (= &#39;L&#39;)
length 5: 011xxxxx 3 &gt; 01100111 (= &#39;g&#39;)</code></pre>
<p>Notice these encodings in the initialization string. Only the coding
for <code>5</code> needs an escape
(<code>5 = ..... &gt; 01111111 = '\177'</code>). The way the length is
encoded still allows the encoding to be its own counter:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> putchar<span class="op">(</span>encoding <span class="op">&amp;</span> <span class="dv">1</span> <span class="op">?</span> <span class="ch">&#39;-&#39;</span> <span class="op">:</span> <span class="ch">&#39;.&#39;</span><span class="op">);</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a> encoding <span class="op">=</span> <span class="op">(</span>encoding <span class="op">+</span> <span class="dv">32</span><span class="op">)</span> <span class="op">&gt;&gt;</span> <span class="dv">1</span><span class="op">;</span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span>encoding <span class="op">&gt;</span> <span class="dv">35</span><span class="op">);</span></span></code></pre></div>
<p>The last shift will always result in <code>00100010</code>, hence the
test for <code>&gt;35</code>. Note that the calculation for the next
value of <code>encoding</code> is done at <code>int</code> precision, so
that the actual value of the <code>char</code> remains
<code>&lt;= 127</code>.</p>
<p>The character <code>'-'</code> (ASCII 45) and <code>'.'</code> (ASCII
46) are conveniently in sequence, so the putchar can simply be</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>putchar<span class="op">(</span><span class="dv">45</span> <span class="op">+</span> encoding <span class="op">%</span> <span class="dv">2</span><span class="op">);</span></span></code></pre></div>
<p>I used the modulo operator this time, because <code>+</code> takes
precedence over <code>&amp;</code>. The assignment can be incorporated
into the <code>while</code> control test, and a <code>do-while</code>
loop with a body of a single expression statement can be written as a
<code>while</code> loop with a comma operator in the test:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span><span class="op">(</span>putchar<span class="op">(</span><span class="dv">45</span> <span class="op">+</span> encoding <span class="op">%</span> <span class="dv">2</span><span class="op">),</span> encoding <span class="op">=</span> encoding <span class="op">+</span> <span class="dv">32</span> <span class="op">&gt;&gt;</span> <span class="dv">1</span><span class="op">);</span></span></code></pre></div>
<p>Voila.</p>
<p>Now, the decoding of Morse codes is just the reverse. We shift in
<code>0</code>s and <code>1</code>s as we scan the line. But: we have to
scan from back to front (the left most Morse symbol is in the least
significant bit, and thus has to shifted in last). The test for the
scanning while loop must stop when there are no more <code>.</code> or
<code>-</code> on the left. Hence we need a terminating character in
front of the line. The input line is read one past the encoding string
(into the same character array) the terminating character for the
reverse scan is therefore provided by the implicit <code>'\0'</code> of
the array initializer ! The test also stops when at most 5 symbols have
been shifted in.</p>
<p>The encoded character is then looked up in the encoding string with
<code>memchr(3)</code> (why <code>memchr(3)</code> is explained later).
Either a <code>?</code> (when there are more than 5 consecutive Morse
symbols, or if the sequence is unknown) or the decoded character is
printed. Or a <code>' '</code> if there was an extra space in the source
line. Note the use of “or” in these last sentences, as they explain the
use of the conditional operator.</p>
<p>The <code>strspn(3)</code> calls need either <code>" .-"</code> or
<code>".-"</code> as argument. Of course they are overlapped. I put
these strings between the encodings for digits and letters. This is OK,
since neither of these characters, or the <code>'\0'</code>, is a valid
encoding ! We must, however, use <code>memchr(3)</code> instead of
<code>strchr(3)</code> in the decoding lookup because of this
<code>'\0'</code>. Since it is far more obscure this way, I hope you’ll
forgive me.</p>
<p>The outline of the program is roughly as follows</p>
<pre><code>while (more lines) {
if (line is in morse) {
while (more characters) {
skip next sequence
if (&#39; &#39;)
putchar(&#39; &#39;);
else
decode_sequence; /* backwards */
}
} else {
while (more characters) {
if (isalnum)
encode_character;
putchar(&#39; &#39;);
}
}</code></pre>
<p>Because of the <em>two</em> <code>while(more characters)</code> loops
are the same, I’ve exchanged the <code>if(line is in morse)</code> and
the two <code>while</code> loops (so there is <em>single</em>
<code>while</code> loop). However, we must now store the
<code>if(line is in morse)</code> test for efficiency (it would be
stupid to test the entire line for every character). This is done in
<code>l[0]</code> ! (the first encoding is thus in <code>l[1]</code>).
The <code>memchr(3)</code> decoding lookup is not disturbed, because the
test is always <code>0</code> for Morse lines, and <code>'\0'</code> is
not a possible encoding. <code>l[0]</code> is also used as the temporary
shift character while encoding a line of text. This does not disturb the
<code>if (line is in morse)</code> test, as the temporary
<code>l[0]</code> will remain <code>!= 0</code>.</p>
<p>I’ve put the <code>if</code>s in the above layout into a single
switch. Hope you don’t mind ;-)</p>
<p>Summary of the use of l[999]:</p>
<pre><code>l[0] result of &quot;is this line in morse&quot; test
l[0] temporary shift during encoding
l[0] - l[33] Morse codings (letters and digits, plus garbage)
l[11] - l[14] strspn argument
l[12] - l[14] strspn argument
l[34] terminator for backward decoding
l[35] - l[998] input line</code></pre>
<hr />
<p>Selected notes: - We don’t need to declare <code>isalnum(3)</code>
(or include ctype.h) as its implicit declaration is correct (int
argument, int result). This is not so for <code>strlen(3)</code>,
<code>strspn(3)</code>, and <code>memchr(3)</code> as they use
<code>size_t</code>. - During development, my gcc 2.7.2.3 had an
internal compiler error (signal 6) on code that was correct ! - lclint
2.4b thinks that “the observer is modified” a couple of times, whereas
it is not. Well, it is, but there is a sequence point in between. -
lclint 2.4b parses line 13 as <error>, whereas it is correct code. -
lclint 2.4b is positive the second <code>while</code> loop is infinite,
whereas it is not.</p>
<hr />
<p>.. - …. .. -. -.- - …. .. … … .–. — .. .-.. . .-. .. … – — .-. . — -…
..-. ..- … -.-. .- - . -.. - …. .- -. - …. . .–. .-. — –. .-. .- –</p>
<p>. -..- . .-. -.-. .. … . -.-. …. .- -. –. . - …. . .–. .-. — –. .-.
.- – … — .. - -.. — . … -. — - … …. — ..- -</p>
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- START: this line starts content from: inc/after-content.default.html -->
<!-- END: this line ends content from: inc/after-content.default.html -->
<!-- START: this line starts content from: inc/end-rightcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/end-row.default.html -->
</div>
<!-- END: this line ends content from: inc/end-row.default.html -->
<!-- START: this line starts content from: inc/footer.default.html -->
<div class="footer">
<hr>
<h2>Coda</h2>
<p><a href="https://validator.w3.org/nu/?doc=#">Nu HTML check this web page</a></p>
<p><a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a></p>
</div>
<!-- END: this line ends content from: inc/footer.default.html -->
<!-- START: this line starts content from: inc/bottom.default.html -->
</body>
</html>
<!-- END: this line ends content from: inc/bottom.default.html -->
+2 -1
View File
@@ -221,9 +221,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
<h1 id="inventory-for-1998dorssel"><a name="inventory"></a>Inventory for
1998/dorssel</h1>
<p><a href="#top">Jump to top</a></p>
<h2 id="primary-files">Primary files</h2>
<ul>
<li><a href="index.html">index.html</a> - entry home page</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1998/dorssel/dorssel.c">dorssel.c</a>
- entry source</li>
@@ -243,6 +243,7 @@ entry source</li>
</ul>
<h2 id="secondary-files">Secondary files</h2>
<ul>
<li><a href="index.html">index.html</a> - entry home page</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1998/dorssel/.entry.json">.entry.json</a>
- description of entry in JSON</li>