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:
1 parent
7babf792e4
commit
9d3438fb88
718 files changed
+17515
-4084
No files matched your search
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Adrian_Mariano" }
|
||||
],
|
||||
"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" : "adrian.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -113,6 +105,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,
|
||||
|
||||
@@ -313,9 +313,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992adrian"><a name="inventory"></a>Inventory for
|
||||
1992/adrian</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/1992/adrian/adrian.c">adrian.c</a>
|
||||
- entry source</li>
|
||||
@@ -354,6 +354,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/1992/adrian/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Albert_van_der_Horst" }
|
||||
],
|
||||
"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" : "albert.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -73,6 +65,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,
|
||||
|
||||
@@ -238,9 +238,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992albert"><a name="inventory"></a>Inventory for
|
||||
1992/albert</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/1992/albert/albert.c">albert.c</a>
|
||||
- entry source</li>
|
||||
@@ -264,6 +264,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/1992/albert/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Anthony_C_Howe" }
|
||||
],
|
||||
"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" : "ant.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -73,6 +65,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,
|
||||
|
||||
+2
-1
@@ -160,9 +160,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992ant"><a name="inventory"></a>Inventory for
|
||||
1992/ant</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/1992/ant/ant.c">ant.c</a>
|
||||
- entry source</li>
|
||||
@@ -186,6 +186,7 @@ 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/1992/ant/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Sean_Barrett" }
|
||||
],
|
||||
"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" : "buzzard.1.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -57,6 +49,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,
|
||||
|
||||
@@ -306,9 +306,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992buzzard.1"><a name="inventory"></a>Inventory
|
||||
for 1992/buzzard.1</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/1992/buzzard.1/buzzard.1.c">buzzard.1.c</a>
|
||||
- entry source</li>
|
||||
@@ -326,6 +326,7 @@ download 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/1992/buzzard.1/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
+20
-12
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Sean_Barrett" }
|
||||
],
|
||||
"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" : "buzzard.2.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -58,11 +50,11 @@
|
||||
"entry_text" : "author description of files"
|
||||
},
|
||||
{
|
||||
"file_path" : "buzzard.2.design.md",
|
||||
"file_path" : "buzzard.2.design.html",
|
||||
"inventory_order" : 100,
|
||||
"OK_to_edit" : true,
|
||||
"display_as" : "markdown",
|
||||
"display_via_github" : true,
|
||||
"display_as" : "html",
|
||||
"display_via_github" : false,
|
||||
"entry_text" : "about the FORTH language"
|
||||
},
|
||||
{
|
||||
@@ -161,6 +153,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,
|
||||
@@ -199,7 +199,15 @@
|
||||
"OK_to_edit" : true,
|
||||
"display_as" : "markdown",
|
||||
"display_via_github" : true,
|
||||
"entry_text" : "markdown source for cannibalism.log.html"
|
||||
"entry_text" : "markdown source for buzzard.2.README.html"
|
||||
},
|
||||
{
|
||||
"file_path" : "buzzard.2.design.md",
|
||||
"inventory_order" : 4294967295,
|
||||
"OK_to_edit" : true,
|
||||
"display_as" : "markdown",
|
||||
"display_via_github" : true,
|
||||
"entry_text" : "markdown source for buzzard.2.design.html"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
<!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="buzzard.2.README.md for 1992/buzzard.2">
|
||||
<meta name="keywords" content="IOCCC, 1992/buzzard.2, buzzard.2.README.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>buzzard.2.README.md for 1992/buzzard.2</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">↑ jump to index.html ↑</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 & (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 -->
|
||||
|
||||
<p><a href="buzzard.2.README.md">buzzard.2.README.md</a> this file<br />
|
||||
<a href="buzzard.2.design.md">buzzard.2.design.md</a> description of
|
||||
FIRST (design documentation of THIRD)<br />
|
||||
<a href="third">third</a> implementation of THIRD in FIRST<br />
|
||||
<a href="help.th">help.th</a> online listing of THIRD primitives<br />
|
||||
</p>
|
||||
<h1 id="first-demos">FIRST demos:</h1>
|
||||
<p>Use <code>./first < <demo></code>.</p>
|
||||
<p><a href="demo1.1st">demo1.1st</a> prints Hello World! assuming
|
||||
ASCII</p>
|
||||
<h1 id="third-demos">THIRD demos:</h1>
|
||||
<p>Use <code>cat third <demo> | ./first</code>.</p>
|
||||
<h2 id="demo-files">Demo files:</h2>
|
||||
<p><a href="demo1.th">demo1.th</a> prints Hello World! regardless of
|
||||
character set <a href="demo2.th">demo2.th</a> demonstrates a simple loop
|
||||
<a href="demo3.th">demo3.th</a> demonstrates a simple if test <a
|
||||
href="demo4.th">demo4.th</a> recursive factorial calculating on the way
|
||||
up <a href="demo5.th">demo5.th</a> recursive factorial calculating on
|
||||
the way down <a href="demo6.th">demo6.th</a> demonstrates switching from
|
||||
compiler to execution mode</p>
|
||||
<h1 id="interactive-third">Interactive THIRD:</h1>
|
||||
<p>Use <code>cat third - | ./first</code>.</p>
|
||||
<p>To include the primitive on-line help, use
|
||||
<code>cat third help.th - | ./first</code>.</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 -->
|
||||
@@ -0,0 +1,847 @@
|
||||
<!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="buzzard.2.design.md for 1992/buzzard.2">
|
||||
<meta name="keywords" content="IOCCC, 1992/buzzard.2, buzzard.2.design.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>buzzard.2.design.md for 1992/buzzard.2</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">↑ jump to index.html ↑</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 & (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="first-third-almost-forth">FIRST & THIRD (almost FORTH)</h1>
|
||||
<p>FORTH is a language mostly familiar to users of “small” machines.
|
||||
FORTH programs are small because they are interpreted–a function call in
|
||||
FORTH takes two bytes. FORTH is an extendable language– built-in
|
||||
primitives are indistinguishable from user-defined <em>words</em>. FORTH
|
||||
interpreters are small because much of the system can be coded in
|
||||
FORTH–only a small number of primitives need to be implemented. Some
|
||||
FORTH interpreters can also compile defined words into machine code,
|
||||
resulting in a fast system.</p>
|
||||
<p>FIRST is an incredibly small language which is sufficient for
|
||||
defining the language THIRD, which is mostly like FORTH. There are some
|
||||
differences, and THIRD is probably just enough like FORTH for those
|
||||
differences to be disturbing to regular FORTH users.</p>
|
||||
<p>The only existing FIRST interpreter is written in obfuscated C, and
|
||||
rings in at under 800 bytes of source code, although through deletion of
|
||||
both whitespace and obfuscation it can be brought to about 650
|
||||
bytes.</p>
|
||||
<p>This document FIRST defines the FIRST environment and primitives,
|
||||
with relevant design decision explanations. It secondly documents the
|
||||
general strategies we will use to implement THIRD. The THIRD section
|
||||
demonstrates how the complete THIRD system is built up using FIRST.</p>
|
||||
<h2 id="section-1-first">Section 1: FIRST</h2>
|
||||
<h3 id="environment">Environment</h3>
|
||||
<p>FIRST implements a virtual machine. The machine has three chunks of
|
||||
memory: “main memory”, “the stack”, and “string storage”. When the
|
||||
virtual machine wishes to do random memory accesses, they come out of
|
||||
main memory–it cannot access the stack or string storage.</p>
|
||||
<p>The stack is simply a standard LIFO data structure that is used
|
||||
implicitly by most of the FIRST primitives. The stack is made up of
|
||||
<code>int</code>s, whatever size they are on the host machine.</p>
|
||||
<p>String storage is used to store the names of built-in and defined
|
||||
primitives. Separate storage is used for these because it allows the C
|
||||
code to use C string operations, reducing C source code size.</p>
|
||||
<p>Main memory is a large array of <code>int</code>s. When we speak of
|
||||
addresses, we actually mean indices into main memory. Main memory is
|
||||
used for two things, primarily: the return stack and the dictionary.</p>
|
||||
<p>The return stack is a LIFO data structure, independent of the
|
||||
above-mentioned “stack”, which is used by FIRST to keep track of
|
||||
function call return addresses.</p>
|
||||
<p>The dictionary is a list of words. Each word contains a header and a
|
||||
data field. In the header is the address of the previous word, an index
|
||||
into the string storage indicating where the name of this word is
|
||||
stored, and a “code pointer”. The code pointer is simply an integer
|
||||
which names which “machine-language-primitive” implements this
|
||||
instruction. For example, for defined words the code pointer names the
|
||||
“run some code” primitive, which pushes the current program counter onto
|
||||
the return stack and sets the counter to the address of the data field
|
||||
for this word.</p>
|
||||
<p>There are several important pointers into main memory. There is a
|
||||
pointer to the most recently defined word, which is used to start
|
||||
searches back through memory when compiling words. There is a pointer to
|
||||
the top of the return stack. There is a pointer to the current end of
|
||||
the dictionary, used while compiling.</p>
|
||||
<p>For the last two pointers, namely the return stack pointer and the
|
||||
dictionary pointer, there is an important distinction: the pointers
|
||||
themselves are stored in main memory (in <code>FIRST</code>’s main
|
||||
memory). This is critical, because it means FIRST programs can get at
|
||||
them without any further primitives needing to be defined.</p>
|
||||
<h3 id="instructions">Instructions</h3>
|
||||
<p>There are two kinds of FIRST instructions, normal instructions and
|
||||
immediate instructions. Immediate instructions do something significant
|
||||
when they are used. Normal instructions compile a pointer to their
|
||||
executable part onto the end of the dictionary. As we will see, this
|
||||
means that by default FIRST simply compiles things.</p>
|
||||
<h4 id="integer-operations">Integer Operations</h4>
|
||||
<pre><code>SYMBOL NAME FUNCTION
|
||||
|
||||
- binary minus pop top 2 elements of stack, subtract, push
|
||||
|
||||
* multiply pop top 2 elements of stack, multiply, push
|
||||
|
||||
/ divide pop top 2 elements of stack, divide, push
|
||||
|
||||
<0 less than 0 pop top element of stack, push 1 if < 0 else 0</code></pre>
|
||||
<p>Note that we can synthesize addition and negation from binary minus,
|
||||
but we cannot synthesize a time efficient divide or multiply from it.
|
||||
<code><0</code> is synthesize-able, but only in a non-portable
|
||||
way.</p>
|
||||
<h4 id="memory-operations">Memory Operations</h4>
|
||||
<pre><code>SYMBOL NAME FUNCTION
|
||||
|
||||
@ fetch pop top of stack, treat as address to push contents of
|
||||
|
||||
! store top of stack is address, 2nd is value; store to memory
|
||||
and pop both off the stack</code></pre>
|
||||
<h4 id="inputoutput-operations">Input/Output Operations</h4>
|
||||
<pre><code>NAME FUNCTION
|
||||
|
||||
echo output top of stack through C's putchar()
|
||||
|
||||
key push C's getchar() onto top of stack
|
||||
|
||||
_read read a space-delimited word, find it in the
|
||||
dictionary, and compile a pointer to
|
||||
that word's code pointer onto the
|
||||
current end of the dictionary</code></pre>
|
||||
<p>Although <code>_read</code> could be synthesized from key, we need
|
||||
<code>_read</code> to be able to compile words to be able to start any
|
||||
syntheses.</p>
|
||||
<h4 id="execution-operations">Execution Operations</h4>
|
||||
<pre><code>NAME FUNCTION
|
||||
|
||||
exit leave the current function: pop the return stack
|
||||
into the program counter</code></pre>
|
||||
<h4 id="immediate-compilation-operations">Immediate (compilation)
|
||||
Operations</h4>
|
||||
<pre><code>SYMBOL NAME FUNCTION
|
||||
|
||||
: define read in the next space-delimited word, add it to
|
||||
the end of our string storage, and generate
|
||||
a header for the new word so that when it
|
||||
is typed it compiles a pointer to itself
|
||||
so that it can be executed.
|
||||
|
||||
immediate immediate when used immediately after a name following a ':',
|
||||
it makes the word being defined run whenever
|
||||
it is typed.</code></pre>
|
||||
<p><code>:</code> cannot be synthesized, because we could not synthesize
|
||||
anything. <code>immediate</code> has to be an immediate operation, so it
|
||||
could not be synthesized unless by default operations were immediate;
|
||||
but that would preclude our being able to do any useful compilation.</p>
|
||||
<h4 id="stack-operations">Stack Operations</h4>
|
||||
<pre><code>NAME FUNCTION
|
||||
|
||||
pick pop top of stack, use as index into stack and copy up
|
||||
that element</code></pre>
|
||||
<p>If the data stack were stored in main memory, we could synthesize
|
||||
<code>pick</code>; but putting the stack and stack pointer in main
|
||||
memory would significantly increase the C source code size.</p>
|
||||
<p>There are three more primitives, but they are “internal only”– they
|
||||
have no names and no dictionary entries. The first is
|
||||
<code>pushint</code>. It takes the next integer out of the instruction
|
||||
stream and pushes it on the stack. This could be synthesized, but
|
||||
probably not without using integer constants. It is generated by
|
||||
<code>_read</code> when the input is not a known word. The second is
|
||||
<code>compile me</code>. When this instruction is executed, a pointer to
|
||||
the word’s data field is appended to the dictionary. The third is
|
||||
<code>run me</code>–the word’s data field is taken to be a stream of
|
||||
pointers to words, and is executed.</p>
|
||||
<p>One last note about the environment: FIRST builds a very small word
|
||||
internally that it executes as its main loop. This word calls
|
||||
<code>_read</code> and then calls itself. Each time it calls itself, it
|
||||
uses up a word on the return stack, so it will eventually trash things.
|
||||
This is discussed some more in section 2.</p>
|
||||
<p>Here’s a handy summary of all the FIRST words:</p>
|
||||
<pre><code>WORD DESCRIPTION
|
||||
|
||||
- * / binary integer operations on the stack
|
||||
<0 is top of stack less than 0?
|
||||
@ ! read from or write to memory
|
||||
echo key output or input one character
|
||||
_read read a word from input and compile a pointer to it
|
||||
exit stop running the current function
|
||||
: compile the header of a definition
|
||||
immediate modify the header to create an immediate word</code></pre>
|
||||
<p>Here is a sample FIRST program. I’m assuming you’re using the ASCII
|
||||
character set. FIRST does not depend upon ASCII, but since FIRST has no
|
||||
syntax for character constants, one normally has to use decimal values.
|
||||
This can be avoided using <code>getchar(3)</code>, though. Oh. One other
|
||||
odd thing. FIRST initially builds its symbol table by calling
|
||||
<code>:</code> several times, so it needs to get the names of the base
|
||||
symbols as its first 13 words of input. You could even name them
|
||||
differently if you wanted.</p>
|
||||
<p>These FIRST programs have FORTH comments in them: they are contained
|
||||
inside parentheses. FIRST programs cannot have FORTH comments; but I
|
||||
need some device to indicate what’s going on. (THIRD programs are an
|
||||
entirely different subject.)</p>
|
||||
<pre><code> ( Our first line gives the symbols for the built-ins )
|
||||
: immediate _read @ ! - * / <0 exit echo key _pick
|
||||
|
||||
( now we define a simple word that will print out a couple characters )
|
||||
|
||||
: L ( define a word named 'L' )
|
||||
108 echo ( output an ascii 'l' )
|
||||
exit
|
||||
|
||||
: hello ( define a word named 'hello')
|
||||
72 echo ( output an ascii 'H' )
|
||||
101 echo ( output an ascii 'e' )
|
||||
111 ( push ascii 'o' onto the stack )
|
||||
L L ( output two ascii 'l's )
|
||||
echo ( output the 'o' we pushed on the stack before )
|
||||
10 echo ( print a newline )
|
||||
exit ( stop running this routine )
|
||||
|
||||
: test immediate ( define a word named 'test' that runs whenever typed )
|
||||
hello ( call hello )
|
||||
exit
|
||||
|
||||
test
|
||||
|
||||
( The result of running this program should be:
|
||||
Hello
|
||||
)</code></pre>
|
||||
<h2 id="section-2-motivating-third">Section 2: Motivating THIRD</h2>
|
||||
<p>What is missing from FIRST? There are a large number of important
|
||||
primitives that aren’t implemented, but which are easy to implement.
|
||||
<code>drop</code>, which throws away the top of the stack, can be
|
||||
implemented as <code>{ 0 * + }</code> – that is, multiply the top of the
|
||||
stack by <code>0</code> (which turns the top of the stack into a
|
||||
<code>0</code>), and then add the top two elements of the stack.</p>
|
||||
<p><code>dup</code>, which copies the top of the stack, can be easily
|
||||
implemented using temporary storage locations. Conveniently, FIRST
|
||||
leaves memory locations <code>3</code>, <code>4</code>, and
|
||||
<code>5</code> unused. So we can implement <code>dup</code> by writing
|
||||
the top of stack into <code>3</code>, and then reading it out twice:
|
||||
<code>{ 3 ! 3 @ 3 @ }</code>.</p>
|
||||
<p>We will never use the FIRST primitive <code>pick</code> in building
|
||||
THIRD, just to show that it can be done; <code>pick</code> is only
|
||||
provided because <code>pick</code> itself cannot be built out of the
|
||||
rest of <code>FIRST</code>’s building blocks.</p>
|
||||
<p>So, instead of worrying about stack primitives and the like, what
|
||||
else is missing from FIRST? We get recursion, but no control flow–no
|
||||
conditional operations. We cannot at the moment write a looping routine
|
||||
which terminates.</p>
|
||||
<p>Another glaring dissimilarity between FIRST and FORTH is that there
|
||||
is no “command mode”–you cannot be outside of a <code>:</code>
|
||||
definition and issue some straight commands to be executed. Also, as we
|
||||
noted above, we cannot do comments.</p>
|
||||
<p>FORTH also provides a system for defining new data types, using the
|
||||
words (in one version of FORTH) <code>builds and does</code>. We would
|
||||
like to implement these words as well.</p>
|
||||
<p>As the highest priority thing, we will build control flow structures
|
||||
first. Once we have control structures, we can write recursive routines
|
||||
that terminate, and we are ready to tackle tasks like parsing, and the
|
||||
building of a command mode.</p>
|
||||
<p>By the way, location <code>0</code> holds the dictionary pointer,
|
||||
location <code>1</code> holds the return stack pointer, and location
|
||||
<code>2</code> should always be <code>0</code>–it’s a fake dictionary
|
||||
entry that means <code>pushint</code>.</p>
|
||||
<h2 id="section-3-building-third">Section 3: Building THIRD</h2>
|
||||
<p>In this section we’ll eventually have real comments.</p>
|
||||
<p>The first thing we have to do is give the symbols for our
|
||||
built-ins.</p>
|
||||
<pre><code>: immediate _read @ ! - * / < exit echo key _pick</code></pre>
|
||||
<p>Next we want to be mildly self commenting, so we define the word
|
||||
<code>r</code> to push the <em>address of the return stack pointer</em>
|
||||
onto the stack–NOT the value of the return stack pointer. (In fact, when
|
||||
we run <code>r</code>, the value of the return stack pointer is
|
||||
temporarily changed.)</p>
|
||||
<pre><code>: r 1 exit</code></pre>
|
||||
<p>Next, we’re currently executing a short loop that contains
|
||||
<code>_read</code> and recursion, which is slowly blowing up the return
|
||||
stack. So let’s define a new word, from which you can never return. What
|
||||
it does is drops the top value off the return stack, calls
|
||||
<code>_read</code>, then calls itself. Because it kills the top of the
|
||||
return stack, it can recurse indefinitely.</p>
|
||||
<pre><code>: ]
|
||||
r @ Get the value of the return stack pointer
|
||||
1 - Subtract one
|
||||
r ! Store it back into the return stack pointer
|
||||
_read Read and compile one word
|
||||
] Start over</code></pre>
|
||||
<p>Notice that we don’t need to exit, since we never come back. Also,
|
||||
it’s possible that an immediate word may get run during
|
||||
<code>_read</code>, and that <code>_read</code> will never return!</p>
|
||||
<p>Now let’s get compile running.</p>
|
||||
<pre><code>: main immediate ]
|
||||
main</code></pre>
|
||||
<p>Next off, I’m going to do this the easy but non-portable way, and put
|
||||
some character constant definitions in. I wanted them at the top of the
|
||||
file, but that would have burned too much of the return stack.</p>
|
||||
<pre><code>: '"' 34 exit
|
||||
: ')' 41 exit
|
||||
: '\n' 10 exit
|
||||
: 'space' 32 exit
|
||||
: '0' 48 exit
|
||||
: '-' 45 exit
|
||||
|
||||
: cr '\n' echo exit</code></pre>
|
||||
<p>Next, we want to define some temporary variables for locations
|
||||
<code>3</code>, <code>4</code>, and <code>5</code>, since this’ll make
|
||||
our code look clearer.</p>
|
||||
<pre><code>: _x 3 @ exit
|
||||
: _x! 3 ! exit
|
||||
: _y 4 @ exit
|
||||
: _y! 4 ! exit
|
||||
</code></pre>
|
||||
<p>OK. Now, we want to make THIRD look vaguely like FORTH, so we’re
|
||||
going to define <code>;</code>. What <code>;</code> ought to do is
|
||||
terminate a compilation, and turn control over to the command-mode
|
||||
handler. We don’t have one, so all we want <code>;</code> to do for now
|
||||
is compile <code>exit</code> at the end of the current word. To do this
|
||||
we’ll need several other words.</p>
|
||||
<p>Swap by writing out the top two elements into temps, and then reading
|
||||
them back in the other order.</p>
|
||||
<pre><code>: swap _x! _y! _x _y exit</code></pre>
|
||||
<p>Take another look and make sure you see why that works, since it
|
||||
LOOKS like I’m reading them back in the same order–in fact, it not only
|
||||
looks like it, but I AM!</p>
|
||||
<p>Addition might be nice to have. To add, we need to negate the top
|
||||
element of the stack, and then subtract. To negate, we subtract from
|
||||
<code>0</code>.</p>
|
||||
<pre><code>: +
|
||||
0 swap -
|
||||
-
|
||||
exit
|
||||
</code></pre>
|
||||
<p>Create a copy of the top of stack.</p>
|
||||
<pre><code>: dup _x! _x _x exit</code></pre>
|
||||
<p>Get a mnemonic name for our dictionary pointer–we need to compile
|
||||
stuff, so it goes through this.</p>
|
||||
<pre><code>: h 0 exit</code></pre>
|
||||
<p>We’re going to need to advance that pointer, so let’s make a generic
|
||||
pointer-advancing function. Given a pointer to a memory location,
|
||||
increment the value at that memory location.</p>
|
||||
<pre><code>: inc
|
||||
dup @ Get another copy of the address, and get the value
|
||||
so now we have value, address on top of stack.
|
||||
1 + Add one to the value
|
||||
swap Swap to put the address on top of the stack
|
||||
! exit Write it to memory
|
||||
</code></pre>
|
||||
<p><code>,</code> is a standard FORTH word. It should write the top of
|
||||
stack into the dictionary, and advance the pointer</p>
|
||||
<pre><code>: ,
|
||||
h @ Get the value of the dictionary pointer
|
||||
! Write the top of stack there
|
||||
h inc And increment the dictionary pointer
|
||||
exit</code></pre>
|
||||
<p><code>'</code> is a standard FORTH word. It should push the address
|
||||
of the word that follows it onto the stack. We could do this by making
|
||||
<code>'</code> immediate, but then it’d need to parse the next word.
|
||||
Instead, we compile the next word as normal. When <code>'</code> is
|
||||
executed, the top of the return stack will point into the instruction
|
||||
stream immediately after the <code>'</code>. We push the word there, and
|
||||
advance the return stack pointer so that we don’t execute it.</p>
|
||||
<pre><code>: '
|
||||
r @ Get the address of the top of return stack
|
||||
We currently have a pointer to the top of return stack
|
||||
@ Get the value from there
|
||||
We currently have a pointer to the instruction stream
|
||||
dup Get another copy of it--the bottom copy will stick
|
||||
around until the end of this word
|
||||
1 + Increment the pointer, pointing to the NEXT instruction
|
||||
r @ ! Write it back onto the top of the return stack
|
||||
We currently have our first copy of the old pointer
|
||||
to the instruction stream
|
||||
@ Get the value there--the address of the "next word"
|
||||
exit
|
||||
</code></pre>
|
||||
<p>Now we’re set. <code>;</code> should be an immediate word that pushes
|
||||
the address of <code>exit</code> onto the stack, then writes it out.</p>
|
||||
<pre><code>: ; immediate
|
||||
' exit Get the address of exit
|
||||
, Compile it
|
||||
exit And we should return</code></pre>
|
||||
<p>Now let’s test out <code>;</code> by defining a useful word:</p>
|
||||
<pre><code>: drop 0 * + ;</code></pre>
|
||||
<p>Since we have <code>inc</code>, we ought to make
|
||||
<code>dec</code>:</p>
|
||||
<pre><code>: dec dup @ 1 - swap ! ;</code></pre>
|
||||
<p>Our next goal, now that we have <code>;</code>, is to implement
|
||||
<code>if-then</code>. To do this, we’ll need to play fast and loose with
|
||||
the return stack, so let’s make some words to save us some effort.</p>
|
||||
<p>First we want a word that pops off the top of the normal stack and
|
||||
pushes it on top of the return stack. We’ll call this <code>tor</code>,
|
||||
for TO-Return-stack. It sounds easy, but when <code>tor</code> is
|
||||
running, there’s an extra value on the return stack–<code>tor</code>’s
|
||||
return address! So we have to pop that off first… We better just bite
|
||||
the bullet and code it out–but we can’t really break it into smaller
|
||||
words, because that’ll trash the return stack.</p>
|
||||
<pre><code>: tor
|
||||
r @ @ Get the value off the top of the return stack
|
||||
swap Bring the value to be pushed to the top of stack
|
||||
r @ ! Write it over the current top of return stack
|
||||
r @ 1 + r ! Increment the return stack pointer--but can't use inc
|
||||
r @ ! Store our return address back on the return stack
|
||||
;</code></pre>
|
||||
<p>Next we want the opposite routine, which pops the top of the return
|
||||
stack, and puts it on the normal stack.</p>
|
||||
<pre><code>: fromr
|
||||
r @ @ Save old value
|
||||
r @ 1 - r ! Decrement pointer
|
||||
r @ @ Get value that we want off
|
||||
swap Bring return address to top
|
||||
r @ ! Store it and return
|
||||
;</code></pre>
|
||||
<p>Now, if we have a routine that’s recursing, and we want to be polite
|
||||
about the return stack, right before we recurse we can run
|
||||
<code>{ fromr drop }</code> so the stack won’t blow up. This means,
|
||||
though, that the first time we enter this recursive routine, we blow our
|
||||
<em>real</em> return address–so when we’re done, we’ll return up two
|
||||
levels. To save a little, we make <code>tail</code> mean
|
||||
<code>{ fromr drop }</code>; however, it’s more complex since there’s a
|
||||
new value on top of the return stack.</p>
|
||||
<pre><code>: tail fromr fromr drop tor ;</code></pre>
|
||||
<p>Now, we want to do <code>if</code>. To do this, we need to convert
|
||||
values to boolean values. The next few words set this up.</p>
|
||||
<p><code>minus</code> gives us unary negation.</p>
|
||||
<pre><code>: minus 0 swap - ;</code></pre>
|
||||
<p>If top of stack is boolean, <code>bnot</code> gives us inverse</p>
|
||||
<pre><code>: bnot 1 swap - ;</code></pre>
|
||||
<p>To compare two numbers, subtract and compare to <code>0</code>.</p>
|
||||
<pre><code>: < - <0 ;</code></pre>
|
||||
<p><code>logical</code> turns the top of stack into either
|
||||
<code>0</code> or <code>1</code>.</p>
|
||||
<pre><code>: logical
|
||||
dup Get two copies of it
|
||||
0 < 1 if < 0, 0 otherwise
|
||||
swap minus Swap number back up, and take negative
|
||||
0 < 1 if original was > 0, 0 otherwise
|
||||
+ Add them up--has to be 0 or 1!
|
||||
;</code></pre>
|
||||
<p><code>not</code> returns 1 if top of stack is 0, and 0 otherwise</p>
|
||||
<pre><code>: not logical bnot ;</code></pre>
|
||||
<p>We can test equality by subtracting and comparing to
|
||||
<code>0</code>.</p>
|
||||
<pre><code>: = - not ;</code></pre>
|
||||
<p>Just to show how you compute a branch: Suppose you’ve compiled a call
|
||||
to branch, and immediately after it is an integer constant with the
|
||||
offset of how far to branch. To branch, we use the return stack to read
|
||||
the offset, and add that on to the top of the return stack, and
|
||||
return.</p>
|
||||
<pre><code>: branch
|
||||
r @ Address of top of return stack
|
||||
@ Our return address
|
||||
@ Value from there: the branch offset
|
||||
r @ @ Our return address again
|
||||
+ The address we want to execute at
|
||||
r @ ! Store it back onto the return stack
|
||||
;</code></pre>
|
||||
<p>For conditional branches, we want to branch by a certain amount if
|
||||
true, otherwise we want to skip over the branch offset constant–that is,
|
||||
branch by one. Assuming that the top of the stack is the branch offset,
|
||||
and the second on the stack is <code>1</code> if we should branch, and
|
||||
<code>0</code> if not, the following computes the correct branch
|
||||
offset.</p>
|
||||
<pre><code>: computebranch 1 - * 1 + ;</code></pre>
|
||||
<p>Branch if the value on top of the stack is <code>0</code>.</p>
|
||||
<pre><code>: notbranch
|
||||
not
|
||||
r @ @ @ Get the branch offset
|
||||
computebranch Adjust as necessary
|
||||
r @ @ + Calculate the new address
|
||||
r @ ! Store it
|
||||
;</code></pre>
|
||||
<p><code>here</code> is a standard FORTH word which returns a pointer to
|
||||
the current dictionary address–that is, the value of the dictionary
|
||||
pointer.</p>
|
||||
<pre><code>: here h @ ;</code></pre>
|
||||
<p>We’re ALL SET to compile <code>if...else...then</code> constructs!
|
||||
Here’s what we do. When we get <code>if</code>, we compile a call to
|
||||
<code>notbranch</code>, and then compile a dummy offset, because we
|
||||
don’t know where the <code>then</code> will be. On the <em>stack</em> we
|
||||
leave the address where we compiled the dummy offset. <code>then</code>
|
||||
will calculate the offset and fill it in for us.</p>
|
||||
<pre><code>: if immediate
|
||||
' notbranch , Compile notbranch
|
||||
here Save the current dictionary address
|
||||
0 , Compile a dummy value
|
||||
;</code></pre>
|
||||
<p><code>then</code> expects the address to <code>fixup</code> to be on
|
||||
the stack.</p>
|
||||
<pre><code>: then immediate
|
||||
dup Make another copy of the address
|
||||
here Find the current location, where to branch to
|
||||
swap - Calculate the difference between them
|
||||
swap ! Bring the address to the top, and store it.
|
||||
;</code></pre>
|
||||
<p>Now that we can do <code>if...then</code> statements, we can do some
|
||||
parsing! Let’s introduce real FORTH comments. <code>find-)</code> will
|
||||
scan the input until it finds a <code>)</code>, and exit.</p>
|
||||
<pre><code>: find-)
|
||||
key Read in a character
|
||||
')' = Compare it to close parentheses
|
||||
not if If it's not equal
|
||||
tail find-) repeat (popping R stack)
|
||||
then Otherwise branch here and exit
|
||||
;
|
||||
|
||||
: ( immediate
|
||||
find-)
|
||||
;
|
||||
|
||||
( we should be able to do FORTH-style comments now )
|
||||
|
||||
( now that we've got comments, we can comment the rest of the code
|
||||
in a legitimate [self parsing] fashion. Note that you can't
|
||||
nest parentheses... )
|
||||
|
||||
: else immediate
|
||||
' branch , ( compile a definite branch )
|
||||
here ( push the backpatching address )
|
||||
0 , ( compile a dummy offset for branch )
|
||||
swap ( bring old backpatch address to top )
|
||||
dup here swap - ( calculate the offset from old address )
|
||||
swap ! ( put the address on top and store it )
|
||||
;
|
||||
|
||||
: over _x! _y! _y _x _y ;
|
||||
|
||||
: add
|
||||
_x! ( save the pointer in a temp variable )
|
||||
_x @ ( get the value pointed to )
|
||||
+ ( add the incremement from on top of the stack )
|
||||
_x ! ( and save it )
|
||||
;
|
||||
|
||||
: allot h add ;
|
||||
|
||||
: maybebranch
|
||||
logical ( force the TOS to be 0 or 1 )
|
||||
r @ @ @ ( load the branch offset )
|
||||
computebranch ( calculate the condition offset [either TOS or 1])
|
||||
r @ @ + ( add it to the return address )
|
||||
r @ ! ( store it to our return address and return )
|
||||
;
|
||||
|
||||
: mod _x! _y! ( get x then y off of stack )
|
||||
_y _y _x / _x * ( y - y / x * x )
|
||||
-
|
||||
;
|
||||
|
||||
: printnum
|
||||
dup
|
||||
10 mod '0' +
|
||||
swap 10 / dup
|
||||
if
|
||||
printnum
|
||||
echo
|
||||
else
|
||||
drop
|
||||
echo
|
||||
then
|
||||
;
|
||||
|
||||
: .
|
||||
dup 0 <
|
||||
if
|
||||
'-' echo minus
|
||||
then
|
||||
printnum
|
||||
'space' echo
|
||||
;
|
||||
|
||||
: debugprint dup . cr ;
|
||||
|
||||
( the following routine takes a pointer to a string, and prints it,
|
||||
except for the trailing quote. returns a pointer to the next word
|
||||
after the trailing quote )
|
||||
|
||||
: _print
|
||||
dup 1 +
|
||||
swap @
|
||||
dup '"' =
|
||||
if
|
||||
drop exit
|
||||
then
|
||||
echo
|
||||
tail _print
|
||||
;
|
||||
|
||||
: print _print ;
|
||||
|
||||
( print the next thing from the instruction stream )
|
||||
: immprint
|
||||
r @ @
|
||||
print
|
||||
r @ !
|
||||
;
|
||||
|
||||
: find-"
|
||||
key dup ,
|
||||
'"' =
|
||||
if
|
||||
exit
|
||||
then
|
||||
tail find-"
|
||||
;
|
||||
|
||||
: " immediate
|
||||
key drop
|
||||
' immprint ,
|
||||
find-"
|
||||
;
|
||||
|
||||
: do immediate
|
||||
' swap , ( compile 'swap' to swap the limit and start )
|
||||
' tor , ( compile to push the limit onto the return stack )
|
||||
' tor , ( compile to push the start on the return stack )
|
||||
here ( save this address so we can branch back to it )
|
||||
;
|
||||
|
||||
: i r @ 1 - @ ;
|
||||
: j r @ 3 - @ ;
|
||||
|
||||
: > swap < ;
|
||||
: <= 1 + < ;
|
||||
: >= swap <= ;
|
||||
|
||||
: inci
|
||||
r @ 1 - ( get the pointer to i )
|
||||
inc ( add one to it )
|
||||
r @ 1 - @ ( find the value again )
|
||||
r @ 2 - @ ( find the limit value )
|
||||
<=
|
||||
if
|
||||
r @ @ @ r @ @ + r @ ! exit ( branch )
|
||||
then
|
||||
fromr 1 +
|
||||
fromr drop
|
||||
fromr drop
|
||||
tor
|
||||
;
|
||||
|
||||
: loop immediate ' inci @ here - , ;
|
||||
|
||||
: loopexit
|
||||
|
||||
fromr drop ( pop off our return address )
|
||||
fromr drop ( pop off i )
|
||||
fromr drop ( pop off the limit of i )
|
||||
; ( and return to the caller's caller routine )
|
||||
|
||||
: execute
|
||||
8 !
|
||||
' exit 9 !
|
||||
8 tor
|
||||
;
|
||||
|
||||
: :: ; ( :: is going to be a word that does ':' at runtime )
|
||||
|
||||
: fix-:: immediate 3 ' :: ! ;
|
||||
fix-::
|
||||
|
||||
( Override old definition of ':' with a new one that invokes ] )
|
||||
: : immediate :: ] ;
|
||||
|
||||
: command
|
||||
here 5 ! ( store dict pointer in temp variable )
|
||||
_read ( compile a word )
|
||||
( if we get control back: )
|
||||
here 5 @
|
||||
= if
|
||||
tail command ( we didn't compile anything )
|
||||
then
|
||||
here 1 - h ! ( decrement the dictionary pointer )
|
||||
here 5 @ ( get the original value )
|
||||
= if
|
||||
here @ ( get the word that was compiled )
|
||||
execute ( and run it )
|
||||
else
|
||||
here @ ( else it was an integer constant, so push it )
|
||||
here 1 - h ! ( and decrement the dictionary pointer again )
|
||||
then
|
||||
tail command
|
||||
;
|
||||
|
||||
: make-immediate ( make a word just compiled immediate )
|
||||
here 1 - ( back up a word in the dictionary )
|
||||
dup dup ( save the pointer to here )
|
||||
h ! ( store as the current dictionary pointer )
|
||||
@ ( get the run-time code pointer )
|
||||
swap ( get the dict pointer again )
|
||||
1 - ( point to the compile-time code pointer )
|
||||
! ( write run-time code pointer on compile-time pointer )
|
||||
;
|
||||
|
||||
: <build immediate
|
||||
make-immediate ( make the word compiled so far immediate )
|
||||
' :: , ( compile '::', so we read next word )
|
||||
2 , ( compile 'pushint' )
|
||||
here 0 , ( write out a 0 but save address for does> )
|
||||
' , , ( compile a push that address onto dictionary )
|
||||
;
|
||||
|
||||
: does> immediate
|
||||
' command , ( jump back into command mode at runtime )
|
||||
here swap ! ( backpatch the build> to point to here )
|
||||
2 , ( compile run-code primitive so we look like a word )
|
||||
' fromr , ( compile fromr, which leaves var address on stack )
|
||||
;
|
||||
|
||||
|
||||
: _dump ( dump out the definition of a word, sort of )
|
||||
dup " (" . " , "
|
||||
dup @ ( save the pointer and get the contents )
|
||||
dup ' exit
|
||||
= if
|
||||
" ;)" cr exit
|
||||
then
|
||||
. " ), "
|
||||
1 +
|
||||
tail _dump
|
||||
;
|
||||
|
||||
: dump _dump ;
|
||||
|
||||
: # . cr ;
|
||||
|
||||
: var <build , does> ;
|
||||
: constant <build , does> @ ;
|
||||
: array <build allot does> + ;
|
||||
|
||||
: [ immediate command ;
|
||||
: _welcome " Welcome to THIRD.
|
||||
Ok.
|
||||
" ;
|
||||
|
||||
: ; immediate ' exit , command exit
|
||||
|
||||
[
|
||||
|
||||
_welcome</code></pre>
|
||||
|
||||
<!-- 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 -->
|
||||
@@ -333,9 +333,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992buzzard.2"><a name="inventory"></a>Inventory
|
||||
for 1992/buzzard.2</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/1992/buzzard.2/buzzard.2.c">buzzard.2.c</a>
|
||||
- entry source</li>
|
||||
@@ -350,9 +350,8 @@ href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/bu
|
||||
- original source</li>
|
||||
<li><a href="buzzard.2.README.html">buzzard.2.README.html</a> - author
|
||||
description of files</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/buzzard.2.design.md">buzzard.2.design.md</a>
|
||||
- about the FORTH language</li>
|
||||
<li><a href="buzzard.2.design.html">buzzard.2.design.html</a> - about
|
||||
the FORTH language</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/try.alt.sh">try.alt.sh</a>
|
||||
- how to run alternative code</li>
|
||||
@@ -391,6 +390,7 @@ download 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/1992/buzzard.2/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
@@ -403,7 +403,10 @@ href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/RE
|
||||
- markdown source for index.html</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/buzzard.2.README.md">buzzard.2.README.md</a>
|
||||
- markdown source for cannibalism.log.html</li>
|
||||
- markdown source for buzzard.2.README.html</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1992/buzzard.2/buzzard.2.design.md">buzzard.2.design.md</a>
|
||||
- markdown source for buzzard.2.design.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Andreas_Gustafsson" }
|
||||
],
|
||||
"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" : "gson.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,
|
||||
|
||||
@@ -348,9 +348,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992gson"><a name="inventory"></a>Inventory for
|
||||
1992/gson</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/1992/gson/gson.c">gson.c</a>
|
||||
- entry source</li>
|
||||
@@ -371,6 +371,7 @@ 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/1992/gson/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Ian_Collier" }
|
||||
],
|
||||
"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" : "imc.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -57,6 +49,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,
|
||||
|
||||
+2
-1
@@ -277,9 +277,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992imc"><a name="inventory"></a>Inventory for
|
||||
1992/imc</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/1992/imc/imc.c">imc.c</a>
|
||||
- entry source</li>
|
||||
@@ -297,6 +297,7 @@ 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/1992/imc/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
+16
-20
@@ -205,28 +205,24 @@ Entries of 1992 - The 9th IOCCC</h1>
|
||||
<p><strong>Download IOCCC</strong> <a
|
||||
href="1992/ioccc.1992.tar.bz2">1992 entry source</a></p>
|
||||
<ul>
|
||||
<li><a href="1992/adrian/index.html">1992/adrian</a> - Most
|
||||
Educational</li>
|
||||
<li><a href="1992/albert/index.html">1992/albert</a> - Most Useful
|
||||
<li><a href="adrian/index.html">1992/adrian</a> - Most Educational</li>
|
||||
<li><a href="albert/index.html">1992/albert</a> - Most Useful
|
||||
Program</li>
|
||||
<li><a href="1992/ant/index.html">1992/ant</a> - Best Utility</li>
|
||||
<li><a href="1992/buzzard.1/index.html">1992/buzzard.1</a> - Most
|
||||
Obfuscated Algorithm</li>
|
||||
<li><a href="1992/buzzard.2/index.html">1992/buzzard.2</a> - Best
|
||||
Language Tool</li>
|
||||
<li><a href="1992/gson/index.html">1992/gson</a> - Most Humorous
|
||||
Output</li>
|
||||
<li><a href="1992/imc/index.html">1992/imc</a> - Best Output</li>
|
||||
<li><a href="1992/kivinen/index.html">1992/kivinen</a> - Best X
|
||||
Program</li>
|
||||
<li><a href="1992/lush/index.html">1992/lush</a> - Worst Abuse of the C
|
||||
<li><a href="ant/index.html">1992/ant</a> - Best Utility</li>
|
||||
<li><a href="buzzard.1/index.html">1992/buzzard.1</a> - Most Obfuscated
|
||||
Algorithm</li>
|
||||
<li><a href="buzzard.2/index.html">1992/buzzard.2</a> - Best Language
|
||||
Tool</li>
|
||||
<li><a href="gson/index.html">1992/gson</a> - Most Humorous Output</li>
|
||||
<li><a href="imc/index.html">1992/imc</a> - Best Output</li>
|
||||
<li><a href="kivinen/index.html">1992/kivinen</a> - Best X Program</li>
|
||||
<li><a href="lush/index.html">1992/lush</a> - Worst Abuse of the C
|
||||
Preprocessor</li>
|
||||
<li><a href="1992/marangon/index.html">1992/marangon</a> - Best
|
||||
Game</li>
|
||||
<li><a href="1992/nathan/index.html">1992/nathan</a> - Worst Abuse of
|
||||
the Rules</li>
|
||||
<li><a href="1992/vern/index.html">1992/vern</a> - Best of Show</li>
|
||||
<li><a href="1992/westley/index.html">1992/westley</a> - Best Small
|
||||
<li><a href="marangon/index.html">1992/marangon</a> - Best Game</li>
|
||||
<li><a href="nathan/index.html">1992/nathan</a> - Worst Abuse of the
|
||||
Rules</li>
|
||||
<li><a href="vern/index.html">1992/vern</a> - Best of Show</li>
|
||||
<li><a href="westley/index.html">1992/westley</a> - Best Small
|
||||
Program</li>
|
||||
</ul>
|
||||
<p> <strong>Jump to:</strong> <a href="#">top</a></p>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Tero_Kivinen" }
|
||||
],
|
||||
"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" : "kivinen.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -57,6 +49,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,
|
||||
|
||||
@@ -239,9 +239,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992kivinen"><a name="inventory"></a>Inventory for
|
||||
1992/kivinen</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/1992/kivinen/kivinen.c">kivinen.c</a>
|
||||
- entry source</li>
|
||||
@@ -259,6 +259,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/1992/kivinen/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Ed_Luke" }
|
||||
],
|
||||
"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" : "lush.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -57,6 +49,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,
|
||||
|
||||
@@ -158,9 +158,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992lush"><a name="inventory"></a>Inventory for
|
||||
1992/lush</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/1992/lush/lush.c">lush.c</a>
|
||||
- entry source</li>
|
||||
@@ -178,6 +178,7 @@ 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/1992/lush/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Andrea_Marangoni" }
|
||||
],
|
||||
"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" : "marangon.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -49,6 +41,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,
|
||||
|
||||
@@ -165,9 +165,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992marangon"><a name="inventory"></a>Inventory
|
||||
for 1992/marangon</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/1992/marangon/marangon.c">marangon.c</a>
|
||||
- entry source</li>
|
||||
@@ -182,6 +182,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/1992/marangon/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Nathan_Sidwell" }
|
||||
],
|
||||
"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" : "nathan.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -57,6 +49,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,
|
||||
|
||||
@@ -229,9 +229,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992nathan"><a name="inventory"></a>Inventory for
|
||||
1992/nathan</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/1992/nathan/nathan.c">nathan.c</a>
|
||||
- entry source</li>
|
||||
@@ -249,6 +249,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/1992/nathan/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Vern_Paxson" }
|
||||
],
|
||||
"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" : "vern.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -49,6 +41,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,
|
||||
|
||||
@@ -270,9 +270,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992vern"><a name="inventory"></a>Inventory for
|
||||
1992/vern</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/1992/vern/vern.c">vern.c</a>
|
||||
- entry source</li>
|
||||
@@ -287,6 +287,7 @@ 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/1992/vern/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
{ "author_handle" : "Brian_Westley" }
|
||||
],
|
||||
"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" : "westley.c",
|
||||
"inventory_order" : 20,
|
||||
@@ -97,6 +89,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,
|
||||
|
||||
@@ -267,9 +267,9 @@ https://creativecommons.org/licenses/by-sa/4.0/</p>
|
||||
|
||||
<h1 id="inventory-for-1992westley"><a name="inventory"></a>Inventory for
|
||||
1992/westley</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/1992/westley/westley.c">westley.c</a>
|
||||
- entry source</li>
|
||||
@@ -302,6 +302,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/1992/westley/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
|
||||
Reference in new issue
Block a user