Thank you, @chris-sab, for your excellent work and for helping us commit this alpha version of the topbar. As part of this work, the following HTML sections were removed: * begin-row * begin-leftcolumn * sidenav * end-leftcolumn * begin-rightcolumn * before-content * end-rightcolumn * end-row.default Also added a new HTML section, just above the "header" section: * topbar The web site now as a more modern looking topbar, thanks to the work of the contractor (GitHub user @chris-sab) who is working on issue #2273. Performed `make www` to implement the above and test under macOS. TODO: Fix the Responsive Web Design to deal with the new topbar system. TODO: Improve the topbar. What is there now is just an alpha version. TODO: Decide what to do with `png/ioccc.png`. Remove it make selective use of the image on certain top level pages lower down? TODO: The changes to `ioccc.css` causes some formatting problems with pages such as `location.html` (missing blank lines). Fix formatting problems as needed. TODO: Fix the "Nu HTML check this web page" links on things like the year level _YYYY/index.html_ pages. TODO: Correct all HTML errors, warnings and perhaps informative messages from the Nu HTML check. TODO: Consider adding color (colour) to the web pages in such a way that people with color perception challenges can still use the web site. TODO: For those web browsers that have and allow JavaScript, make use of technology such as [Code Mirror](https://codemirror.net/) to directly render source code (C, shell, Makefile, etc.) with syntax coloring (colouring) directly in the browser. For non-JavaScript browsers, fallback to the current use of GitHub source code viewing.
347 lines
18 KiB
HTML
347 lines
18 KiB
HTML
<!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 -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- START: this line starts content from: inc/head.default.html -->
|
||
|
||
<head>
|
||
<link rel="stylesheet" href="../../ioccc.css">
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||
<title>2015/mills2 - Most Compact</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="2015 IOCCC entry mills2 - Most Compact">
|
||
<meta name="keywords" content="IOCCC, 2015, IOCCC 2015, IOCCC entry, mills2, Most Compact">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! 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/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/readme2index.sh -->
|
||
<!-- The content of main section of this web page came from: 2015/mills2/README.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2015/mills2/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2015/mills2/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2015/mills2/README.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- 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/topbar.default.html -->
|
||
|
||
<div class="theader">
|
||
<nav class="topbar">
|
||
<div class="container">
|
||
<div class="logo">
|
||
IOCCC
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Home
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font"><a href="../../index.html">IOCCC Home</a></div>
|
||
<div class="outfit-font"><a href="../../years.html">Winning Entries</a></div>
|
||
<div class="outfit-font"><a href="../../authors.html">People who have won</a></div>
|
||
<div class="outfit-font"><a href="../../location.html">Location of authors</a></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
News
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font"><a href="../../news.html">IOCCC News</a></div>
|
||
<div class="outfit-font"><a href="../../status.html">Contest status</a></div>
|
||
<div class="outfit-font"><a href="../../next/index.html">Rules and Guidelines</a></div>
|
||
<div class="outfit-font"><a href="../../faq.html#submit">How to enter the IOCCC</a></div>
|
||
<div class="outfit-font"><a href="../../faq.html">FAQ</a></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Bugs
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font"><a href="../../bugs.html">Bugs & (mis)features</a></div>
|
||
<div class="outfit-font"><a href="../../faq.html#fix_an_entry">Fixing IOCCC entries</a></div>
|
||
<div class="outfit-font"><a href="../../faq.html#fix_web_site">Fixing the web site</a></div>
|
||
<div class="outfit-font"><a href="../../faq.html#fix_author">Fixing author info</a></div>
|
||
<div class="outfit-font"><a href="../../thanks-for-help.html">Thanks for the help</a></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Judges
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font"><a href="../../judges.html">The IOCCC Judges</a></div>
|
||
<div class="outfit-font"><a href="../../contact.html">Contacting the IOCCC</a></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.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>2015/mills2 - Most Compact</h2>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/header.default.html -->
|
||
<!-- START: this line starts content from: inc/navbar.mid.html -->
|
||
|
||
<div class="navbar">
|
||
<a class="Left" href="../mills1/index.html">← mills1</a>
|
||
<a class="Left" href="../index.html">↑ 2015 ↑</a>
|
||
<a class="Left" href="../muth/index.html">muth →</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/prog.c">C code</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/Makefile">Makefile</a>
|
||
<a class="Right" href="#inventory">Inventory</a>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/navbar.mid.html -->
|
||
<!-- START: this line starts content from: inc/before-content.default.html -->
|
||
|
||
<div class="content" id="content">
|
||
|
||
<!-- END: this line ends content from: inc/before-content.default.html -->
|
||
<!-- START: this line starts content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
|
||
|
||
<!-- START: this line starts content generated by: bin/output-index-author.sh -->
|
||
|
||
<h2 id="author">Author:</h2>
|
||
<ul>
|
||
<li>Name: <a href="../../authors.html#Christopher_Mills">Christopher Mills</a><br>
|
||
Location: <a href="../../location.html#US">US</a> - <em>United States of America</em> (<em>United States</em>)</li>
|
||
</ul>
|
||
|
||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||
|
||
<!-- END: this line ends content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
|
||
<h2 id="to-build">To build:</h2>
|
||
<pre><code> make</code></pre>
|
||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||
<p>The current status of this entry is:</p>
|
||
<pre><code> STATUS: INABIAF - please **DO NOT** fix</code></pre>
|
||
<p>For more detailed information see <a href="../../bugs.html#2015_mills2">2015 mills2 bugs</a>.</p>
|
||
<h2 id="to-use">To use:</h2>
|
||
<pre><code> ./prog compressed_file.Z</code></pre>
|
||
<h2 id="try">Try:</h2>
|
||
<pre><code> ./try.sh</code></pre>
|
||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||
<p>Without ASCII art, the source code of this entry would have been exactly 256
|
||
bytes. Compared to <a href="../../years.html#1990_jaw">1990/jaw</a>, it is very
|
||
impressive, even taking into account the missing <code>atob</code> functionality. Now we wish
|
||
for a <code>compress(1)</code>-like compressor using a similar idea.</p>
|
||
<p>Why is the sad smiley on line 12 in that particular place?</p>
|
||
<pre><code> c=0) :( O</code></pre>
|
||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||
<h3 id="the-program">The Program</h3>
|
||
<p>This program is an implementation of the unix <code>zcat(1)</code> command for printing
|
||
compressed files that have been created by the <code>compress(1)</code> command.</p>
|
||
<p>The adaptive <a href="https://en.wikipedia.org/wiki/Lempel–Ziv–Welch">LZW</a> compression
|
||
employed by <code>compress(1)</code> usually requires a fairly large amount of memory to
|
||
build the decompression tables (in fact, <code>compress(1)</code> has a command-line option
|
||
to control the size of the decompression tables, since some of the early systems
|
||
to which it was ported
|
||
(*cough*<a href="https://computerhistory.org/blog/microsoft-ms-dos-early-source-code/?key=microsoft-ms-dos-early-source-code">MS-DOS</a>*cough*)
|
||
did not have enough memory to use the full 16-bit codes). This version has no
|
||
large static or dynamic tables. It is able to decompress 16-bit files using a
|
||
single function and a few <code>int</code>s.</p>
|
||
<p>To run the program, take an existing compressed file and pass it to the program
|
||
on the command line. On the odd chance you don’t have <code>compress(1)</code> hanging about
|
||
on your system, I’ve provided compressed copies of this year’s IOCCC rules
|
||
and guidelines files. To print them, just do</p>
|
||
<pre><code> ./prog ioccc_guidelines.txt.Z
|
||
./prog ioccc_rules.txt.Z</code></pre>
|
||
<h3 id="the-details">The Details</h3>
|
||
<p>The basic cleverness here comes from realizing that the compressed data is
|
||
itself an encoded version of the code dictionary. When the encoder sees
|
||
an input string that is not in its dictionary, it emits the code corresponding
|
||
to the longest prefix that is in the dictionary and adds a new entry consisting
|
||
of that code followed by the next input character. This means that when the
|
||
decoder wants to know how to decode a code, it just needs to find the spot in
|
||
the code-stream where the encoder added that entry to the dictionary. The
|
||
code at that spot is the prefix, and the first character of the following code
|
||
is the suffix. Decoding then just becomes recursion, to follow the chain of
|
||
prefixes and suffix characters.</p>
|
||
<p>Of course, it’s not nearly that simple. Finding the code in the stream is
|
||
complicated by several issues:</p>
|
||
<ul>
|
||
<li>Codes are at bit offsets within the stream, and must be extracted.</li>
|
||
<li>As codes are added to the dictionary, the code word size grows, so finding
|
||
the offset to a particular code word is involved.</li>
|
||
<li>The <code>compress(1)</code> encoder reserves a code word that clears the coding tables.
|
||
When this is encountered, the computation of offsets and bit sizes reset.</li>
|
||
<li>The <code>compress(1)</code> decoder is designed to always read a block of eight code
|
||
words at the same time, so that it need only read <code>N</code> bytes to get eight
|
||
<code>N-bit</code> code words. When the “clear” code is encountered, the entire eight-word
|
||
block is flushed (since the decoder didn’t know the word size would change).
|
||
The program needs to account for this extra flushing.</li>
|
||
<li>The end of the stream is not explicitly marked; the encoder just pads out
|
||
the output to the next byte. The decoder must notice this to know when
|
||
to stop.</li>
|
||
<li>The output stream contains a header that must be skipped.</li>
|
||
</ul>
|
||
<p>Managing all the details involved added a lovely additional layer of
|
||
obfuscation to the otherwise elegant recursive decoder. Still, the code
|
||
manages it in a remarkably small amount of code.</p>
|
||
<h3 id="limitations">Limitations</h3>
|
||
<p>The decoder doesn’t look at the header. If you supply something that is not
|
||
compressed data, it’s likely to crash in an interesting manner.</p>
|
||
<p>In particular, it doesn’t look at the third byte of the header, which encodes
|
||
the maximum code word size and whether “block mode” was used when the encoder
|
||
was run. If you use <code>compress(1)</code> in its default mode, the maximum word size
|
||
will be 16 bits and “block mode” will be enabled. You are unlikely to find
|
||
any files that don’t use “block mode”, since all versions of <code>compress(1)</code> after
|
||
2.0 (circa 1984) use it by default and have no documented way to disable it.
|
||
Reducing the bit depth is still possibly by using the <code>-b</code> flag. Modern
|
||
systems have no problem with the 200 KB or so needed for 16-bit decoder
|
||
tables, so the need for reducing the table size has passed, hence this program
|
||
always assumes 16-bits… However, should you find a file that needs a
|
||
smaller table, feel free to change the hard-coded 16 in the source into the
|
||
appropriate number and recompile.</p>
|
||
<p>In the event that you don’t supply an argument, or that argument doesn’t name
|
||
a readable file, the program will just silently exit. This is a feature.</p>
|
||
<p>The program depends on having a little-endian system. On a big-endian system
|
||
you will get a weird big-endian version of <code>compress(1)</code>, which might have come
|
||
to pass in an alternate universe where the
|
||
<a href="https://en.wikipedia.org/wiki/VAX">VAX</a> on which <code>compress(1)</code> was authored had
|
||
been big-endian. Luckily for us, it wasn’t, and neither are most of the systems
|
||
you might want to compile this for.</p>
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
|
||
|
||
<!-- START: this line starts content generated by: bin/output-index-inventory.sh -->
|
||
|
||
<div id="inventory">
|
||
<h1 id="inventory-for-2015mills2">Inventory for 2015/mills2</h1>
|
||
</div>
|
||
<p><a href="#top">Jump to top</a></p>
|
||
<h2 id="primary-files">Primary files</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/prog.c">prog.c</a> - entry source</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/Makefile">Makefile</a> - entry Makefile</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/prog.orig.c">prog.orig.c</a> - original source</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/try.sh">try.sh</a> - how to run</li>
|
||
<li><a href="ioccc_guidelines.txt.Z">ioccc_guidelines.txt.Z</a> - compressed IOCCC 2015 guidelines</li>
|
||
<li><a href="ioccc_rules.txt.Z">ioccc_rules.txt.Z</a> - compressed IOCCC 2015 rules</li>
|
||
</ul>
|
||
<h2 id="secondary-files">Secondary files</h2>
|
||
<ul>
|
||
<li><a href="2015_mills2.tar.bz2">2015_mills2.tar.bz2</a> - download entry tarball</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/README.md">README.md</a> - markdown source for this web page</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/.gitignore">.gitignore</a> - list of files that should not be committed under git</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2015/mills2/.path">.path</a> - directory path from top directory</li>
|
||
<li><a href="index.html">index.html</a> - this web page</li>
|
||
</ul>
|
||
|
||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||
|
||
<!-- END: this line ends content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content from: inc/after-content.default.html -->
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/after-content.default.html -->
|
||
<!-- START: this line starts content from: inc/footer.default.html -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
<div id="copyright"><h2>Copyright and CC BY-SA 4.0 License</h2></div>
|
||
<p>All IOCCC content including this file and web page are:</p>
|
||
<b> Copyright © 1984-2024 by Landon Curt Noll. <a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean">Some Rights Reserved</a>.</b>
|
||
<p>This work is licensed by Landon Curt Noll under:</p>
|
||
<p><b><a href="https://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1"
|
||
target="_blank" rel="license noopener noreferrer" style="display:inline-block;"> CC BY-SA 4.0
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/cc.png"
|
||
alt="cc inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/by.png"
|
||
alt="person inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/sa.png"
|
||
alt="arrow looping back on itself inside circle symbol">
|
||
</a></b></p>
|
||
<p>The <b>CC BY-SA 4.0 LEGAL CODE</b> for this license is found under:</p>
|
||
<p> <b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en">
|
||
https://creativecommons.org/licenses/by-sa/4.0/legalcode.en</a></b></p>
|
||
<p>You should <b>carefully review</b> all of the terms and conditions of the
|
||
<a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en">actual license</a>
|
||
before using the licensed material.</p>
|
||
<p>You may wish to review the <b><a href="../../license.html">highlights of some of the key
|
||
features and terms</a></b> of the <a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en">actual license</a>.</p>
|
||
<h2>Coda</h2>
|
||
<p><a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2015%2Fmills2%2Findex.html">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 -->
|