Instead of code blocks the bug / (mis)features statuses are quoted rather than in a code block. In the case that there is more than one a line break was added at the end of all but the last one. A bug status was renamed to be slightly more correct (maybe more than one was renamed for the same purpose but at least one was). The bug statuses in the quotes are now bold to let them stand out better.
728 lines
30 KiB
HTML
728 lines
30 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>2000/dlowe - Worst abuse of the rules</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="2000 IOCCC entry dlowe - Worst abuse of the rules">
|
||
<meta name="keywords" content="IOCCC, 2000, IOCCC 2000, IOCCC entry, dlowe, Worst abuse of the rules">
|
||
</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: 2000/dlowe/README.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2000/dlowe/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2000/dlowe/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2000/dlowe/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">
|
||
<a href="../../index.html" class="logo-link">
|
||
IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Entries
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../years.html" class="sub-item-link">
|
||
Winning Entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../authors.html" class="sub-item-link">
|
||
Winning Authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../location.html" class="sub-item-link">
|
||
Location of winning authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../bugs.html" class="sub-item-link">
|
||
Bugs and (mis)features
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Status
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../news.html" class="sub-item-link">
|
||
IOCCC News
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../status.html" class="sub-item-link">
|
||
Contest status
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/index.html" class="sub-item-link">
|
||
Rules and Guidelines
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
FAQ
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html" class="sub-item-link">
|
||
FAQ
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#submit" class="sub-item-link">
|
||
How to enter the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_an_entry" class="sub-item-link">
|
||
Fixing IOCCC entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_web_site" class="sub-item-link">
|
||
Fixing the website
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_author" class="sub-item-link">
|
||
Updating author info
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
About
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../index.html" class="sub-item-link">
|
||
IOCCC Home
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../judges.html" class="sub-item-link">
|
||
The IOCCC Judges
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../contact.html" class="sub-item-link">
|
||
Contacting the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../SECURITY.html" class="sub-item-link">
|
||
IOCCC Security Policy
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../thanks-for-help.html" class="sub-item-link">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../markdown.html" class="sub-item-link">
|
||
IOCCC markdown guidelines
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="header-mobile-menu">
|
||
<noscript>
|
||
<a href="../../nojs-menu.html" class="topbar-js-label">
|
||
Please Enable JavaScript
|
||
</a>
|
||
</noscript>
|
||
|
||
<button id="header-open-menu-button" class="topbar-mobile-menu">
|
||
<img
|
||
src="../../png/hamburger-icon-open.png"
|
||
alt="hamburger style menu icon - open state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<button id="header-close-menu-button" class="hide-content">
|
||
<img
|
||
src="../../png/hamburger-icon-closed.png"
|
||
alt="hamburger style menu icon - closed state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<div id="mobile-menu-panel" class="hide-content">
|
||
<div class="mobile-menu-container">
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
Entries
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../years.html">
|
||
Winning Entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../authors.html">
|
||
Authors of winning IOCCC entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../location.html">
|
||
Location of authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../bugs.html">
|
||
Bugs and (mis)features
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
|
||
<div class="mobile-menu-item">
|
||
Status
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../status.html">
|
||
Contest status
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/index.html">
|
||
Rules and Guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../news.html">
|
||
IOCCC News
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
FAQ
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html">
|
||
Frequently Asked Questions
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#submit">
|
||
How to enter the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_an_entry">
|
||
Fixing IOCCC entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_web_site">
|
||
Fixing the website
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_author">
|
||
Fixing author info
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
About
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../index.html">
|
||
IOCCC Home
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../judges.html">
|
||
The IOCCC Judges
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../contact.html">
|
||
Contacting the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../thanks-for-help.html">
|
||
Thanks for the help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var headerOpenMenuButton = document.getElementById("header-open-menu-button");
|
||
var headerCloseMenuButton = document.getElementById("header-close-menu-button");
|
||
var mobileMenuPanel = document.getElementById("mobile-menu-panel");
|
||
|
||
headerOpenMenuButton.addEventListener("click", () => {
|
||
headerOpenMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.add("hide-content");
|
||
|
||
headerCloseMenuButton.classList.remove("hide-content");
|
||
headerCloseMenuButton.classList.add("topbar-mobile-menu");
|
||
|
||
mobileMenuPanel.classList.remove("hide-content");
|
||
mobileMenuPanel.classList.add("topbar-mobile-panel");
|
||
});
|
||
|
||
headerCloseMenuButton.addEventListener("click", () => {
|
||
headerCloseMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerCloseMenuButton.classList.add("hide-content");
|
||
|
||
mobileMenuPanel.classList.add("hide-content");
|
||
mobileMenuPanel.classList.remove("topbar-mobile-panel");
|
||
|
||
headerOpenMenuButton.classList.add("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.remove("hide-content");
|
||
});
|
||
</script>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.default.html -->
|
||
<!-- START: this line starts content from: inc/header.default.html -->
|
||
|
||
<div class="header">
|
||
<a href="../../2011/zucker/index.html">
|
||
<img src="../../png/ioccc.png"
|
||
alt="IOCCC image by Matt Zucker"
|
||
width=300
|
||
height=110>
|
||
</a>
|
||
<h1>The International Obfuscated C Code Contest</h1>
|
||
<h2>2000/dlowe - Worst abuse of the rules</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="../dhyang/index.html">← dhyang</a>
|
||
<a class="Left" href="../index.html">↑ 2000 ↑</a>
|
||
<a class="Left" href="../jarijyrki/index.html">jarijyrki →</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/dlowe.c">C code</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/Makefile">Makefile</a>
|
||
<a class="Right" href="#inventory">Inventory</a>
|
||
<a class="Right" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2000%2Fdlowe%2Findex.html">✓</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#J_David_Lowe">J. David Lowe</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 -->
|
||
|
||
<!-- BEFORE: 1st line of markdown file: 2000/dlowe/README.md -->
|
||
<h2 id="to-build">To build:</h2>
|
||
<pre><code> make</code></pre>
|
||
<p>The following bit of perl may help determine the values you need:</p>
|
||
<pre><code> perl -MConfig -e 'print "$Config{archlibexp}/CORE\n"'</code></pre>
|
||
<p>… just in case the Makefile does not figure this out for you.</p>
|
||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||
<p>The current status of this entry is:</p>
|
||
<blockquote>
|
||
<p><strong>STATUS: known bug - please help us fix</strong><br>
|
||
<strong>STATUS: INABIAF - please DO NOT fix</strong></p>
|
||
</blockquote>
|
||
<p>For more detailed information see <a href="../../bugs.html#2000_dlowe">2000/dlowe in bugs.html</a>.</p>
|
||
<h2 id="to-use">To use:</h2>
|
||
<pre><code> ./dlowe [file ...]</code></pre>
|
||
<h2 id="try">Try:</h2>
|
||
<pre><code> ./try.sh</code></pre>
|
||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||
<p>When this entry was submitted the rules of the IOCCC did not prohibit
|
||
the use of embedded language interpreters. The judges considered
|
||
disqualifying this entry because of the use of perl, but on the other
|
||
hand it qualifies as the Worst Abuse of the Rules. As a previous author,
|
||
<a href="../../authors.html#J_David_Lowe">David Lowe</a> continues to inflict the highest quality “poot” on the
|
||
Judges.</p>
|
||
<p>The program also contains an undocumented command for Chad and Chongo (Landon).
|
||
The judges’ remarks contain a clue to the hidden command :-).</p>
|
||
<ul>
|
||
<li>The IOCCC uses an anonymous judging process which keeps the identity
|
||
of the submitters hidden until all winning entries have been selected.</li>
|
||
</ul>
|
||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||
<h3 id="usage">Usage</h3>
|
||
<pre><code> ./dlowe [file ...]</code></pre>
|
||
<h3 id="synopsis">Synopsis</h3>
|
||
<p>This is a <a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation">Reverse Polish
|
||
calculator</a>, loosely
|
||
based on the <code>dc(1)</code> unix calculator.</p>
|
||
<h1 id="syntax">Syntax</h1>
|
||
<p>This program understands the following <code>dc(1)</code> commands:</p>
|
||
<pre><code> p prints the top stack value without altering the stack.
|
||
P prints the top stack value, removing it from the stack, and
|
||
doesn't print a trailing newline.
|
||
f prints the contents of the stack, one number per line,
|
||
without modifying it.
|
||
c clears the stack.
|
||
d pushes a copy of the top stack value onto the stack.
|
||
r reverses the order of the top two stack values.</code></pre>
|
||
<p>And the following arithmetic operators are supported:</p>
|
||
<pre><code> + Pops 2 values and pushes their sum.
|
||
- Pops 2 values and pushes the result of subtracting the first
|
||
from the second.
|
||
* Pops 2 values and pushes their product.
|
||
/ Pops 2 values and pushes the result of dividing the second
|
||
by the first.
|
||
^ Pops 2 values and pushes the result of raising the second
|
||
to the power of the first.
|
||
% Pops 2 values and pushes the remainder of the division that
|
||
/ would do.</code></pre>
|
||
<p>The precision and range are double, like it or not, except that the
|
||
modulus operator actually returns <code>(p1 - (p2 * (p1 / p2)))</code>, but with
|
||
the innermost division calculated at integer precision. This is
|
||
usually what you expect (e.g. <code>echo "12 8 % p" | ./dlowe == 4</code>)</p>
|
||
<p>Commands are read from <code>stdin</code> or from a list of files named on
|
||
the command line. Unlike <code>dc(1)</code>, multiple commands on the same line
|
||
must be space separated. Commands are only executed when a newline
|
||
or EOF is encountered.</p>
|
||
<h3 id="diagnostics">Diagnostics:</h3>
|
||
<pre><code> "stack empty" Not enough on the stack for the requested command
|
||
"divide by zero" Attempt to divide by zero
|
||
"unimplemented" Invalid input
|
||
|
||
Floating point exception (core dumped) (or something to that effect)
|
||
Bug in Perl_sv_upgrade causes this in some cases when
|
||
the results of an operation are really huge (> 10^308)
|
||
This bug appears to be fixed in perl5.6.0</code></pre>
|
||
<h3 id="examples">Examples:</h3>
|
||
<pre><code> $ echo '12 13 14 15 16 + + + + f' | ./dlowe
|
||
70
|
||
$ echo '12 13 14 15 16 17 + - * / p' | ./dlowe
|
||
-0.0515873015873016
|
||
$ echo '+' | ./dlowe
|
||
stack empty
|
||
$ echo '999999999999999 1 + p' | ./dlowe
|
||
1e+15
|
||
$ echo '99999999999999 1 + p' | ./dlowe
|
||
100000000000000
|
||
$ echo '12.5 9 % 10 * 15 + f' | ./dlowe
|
||
50
|
||
$ echo '7 P 6 d P P 8 p' | ./dlowe | tr 876 tpo
|
||
poot</code></pre>
|
||
<h3 id="code-concept">Code Concept:</h3>
|
||
<p>We all know that Perl and other VHLLs (very high level languages)
|
||
are particularly well-suited for (among other things) string
|
||
handling, I/O, and powerful built-in data types, and (relatively)
|
||
poorly suited for number crunching and other processor-intensive
|
||
tasks - areas where C is strongest. This program takes this
|
||
knowledge to its extreme conclusion, using each language for its
|
||
strengths. Thus, it uses Perl to read and parse input, for output,
|
||
and for the easy-to-use list primitive, and uses C for mathematical
|
||
operations. Since the rules of this contest state that the program
|
||
must be generated by an ANSI C compiler, of course, the outer Perl
|
||
layer is wrapped with a thin layer of C.</p>
|
||
<p>In case that wasn’t clear, in a nutshell: this program is C, calling
|
||
embedded Perl (contained in a C string), which in turn calls back to
|
||
C, which performs math on Perl data types and calls Perl functions for
|
||
error reporting.</p>
|
||
<h3 id="requirements">Requirements:</h3>
|
||
<p>Unfortunately, Perl is an evolving beast - that includes the
|
||
embedding API and the XS API. The code was developed under
|
||
<code>Perl 5.005_03</code>, successfully tested against <code>Perl 5.6.0</code>, <code>Perl 5.005_02</code>
|
||
and <code>Perl 5.004_04</code>, and according to the version delta documentation,
|
||
should work as-is with <code>Perl 5.002</code> and later (which has been around
|
||
since February 1996). To clarify - it’s not the Perl code itself
|
||
that may be non-portable, it’s the C code for embedding Perl and for
|
||
calling C from Perl.</p>
|
||
<p>It is also important that Perl be installed cleanly and correctly.
|
||
You may have problems linking if, for example, you have multiple
|
||
overlapping versions of Perl installed (which might not be a problem
|
||
for scripts, but causes problems with embedding the interpreter).
|
||
More commonly, you may get non-fatal warnings from the linker, caused
|
||
by slight mis-configurations of Perl on your system.</p>
|
||
<p>Some compilers also complain that “third argument of <code>main()</code> is
|
||
deprecated” or something to that effect. But in Perl prior to
|
||
<code>5.6.0</code>, the header file “proto.h” actually had a prototype for <code>main()</code>, so
|
||
applications which embed Perl must use the three argument form of <code>main()</code>.</p>
|
||
<h3 id="aside-history">Aside: history…</h3>
|
||
<p>Larry Wall wrote the original Perl in 1986-87, the same two successive
|
||
years he won the IOCCC. I hope this program helps you to realize that
|
||
this was no fluke - that Perl and Obfuscation are as inseparable as,
|
||
say, camels and humps.</p>
|
||
<h3 id="obfuscated">Obfuscated?</h3>
|
||
<ul>
|
||
<li><p>Reverse Polish notation is pretty strange, in and of itself.</p></li>
|
||
<li><p>The layout of the program is three roughly symmetrical “stacks”
|
||
of code. This layout is quite sensitive in places - my C indenter
|
||
actually breaks the code by inserting spaces in certain places.</p></li>
|
||
<li><p>Anyone who has ever programmed in Perl can attest to the fact that
|
||
it is particularly well-suited to obfuscation; thus, the Perl is
|
||
obfuscated. (Here’s my favorite legal Perl from this program:
|
||
<code>_:$_=<>;</code> - but <code>$SS[$#SS]-=$SS[$#SS-1]</code> isn’t bad, either).</p></li>
|
||
<li><p>I’ve eschewed traditional branch and loop structures such as
|
||
<code>if</code> and <code>for</code>, in favor of their oft-neglected cousins, <code>goto</code>
|
||
and <code>?:</code>, in both the Perl and C code.</p></li>
|
||
<li><p>I’ve used some highly magical Perl incantations, such as symbolic
|
||
references, the <code>goto &NAME</code> syntax, <code>AUTOLOAD</code> for exception handling,
|
||
and abuse of the default scalar (<code>$_</code>).</p></li>
|
||
<li><p>I’ve also deliberately used Perl syntax that is very much unlike
|
||
C syntax: the <code>&NAME</code> rather than <code>NAME()</code> function calling syntax,
|
||
leaving off parentheses wherever possible, using <code>print()</code> instead
|
||
of <code>printf()</code>, and using the English style logic operators <code>and</code> and
|
||
<code>or</code> rather than <code>&&</code> and <code>||</code>, for example.</p></li>
|
||
<li><p>The fact that all the Perl code is in double-quotes doesn’t lend
|
||
any readability to the regular expressions and quoted strings
|
||
therein.</p></li>
|
||
<li><p>The points and ways in which C and Perl connect are <em>really</em>
|
||
obscure. They’re also incredibly poorly documented, as they’re
|
||
primarily used in machine-generated code. However, there’s a
|
||
wealth of example code on <a href="https://www.cpan.org">CPAN</a>.</p></li>
|
||
<li><p>The Perl API functions are almost all macros, so you will probably
|
||
find that preprocessor expansion will only make things worse. They
|
||
also have helpful, verbose names like <code>SvNV</code>, <code>SvIV</code>, and <code>newSVpv</code>. I
|
||
couldn’t have done better myself!</p></li>
|
||
<li><p>Figuring out how the mathematical C functions get called is a bit
|
||
tricky. Note the lack of explicit switching based on command
|
||
input.</p></li>
|
||
<li><p>Because of the “interesting” way that commands are interpreted,
|
||
all of the commands have synonyms. For example, if you find it
|
||
easier to remember, <code>=</code> is synonymous with <code>d</code>. This also makes it
|
||
possible to write (even more) obfuscated reverse Polish commands
|
||
(I figure this explanation moves the synonyms from ‘bug’ to
|
||
‘feature’!)</p></li>
|
||
</ul>
|
||
<p>. The first IOCCC entry with an “easter egg”?…</p>
|
||
<h3 id="aside-on-unobfuscated-perl">Aside: on unobfuscated Perl</h3>
|
||
<p>My original intent was to write obfuscated C and crystal-clear Perl,
|
||
to highlight my bending of the rules. Unfortunately, Perl really
|
||
doesn’t lend itself to crystal-clear code…</p>
|
||
<h3 id="bending-the-rules">Bending the rules?</h3>
|
||
<p>Well, the rules never state that you can’t embed another programming
|
||
language, but on the other hand, knowing Perl probably isn’t high on
|
||
the list of qualifications for judges… Oh dear, I guess your C
|
||
beautifier won’t help too much, either ;)</p>
|
||
<p>If you don’t change the rules, it’ll be embedded Ada next year!</p>
|
||
<h3 id="auto-defend">Auto defend</h3>
|
||
<p>A. Isn’t this the obfuscated C contest? What’s this Perl <code>$#_&&$_</code>?</p>
|
||
<p>D. Hey, this program <em>is</em> 100% C, and does not exec an external Perl
|
||
interpreter. It simply links against the Perl language library.
|
||
The “Perl code” is just a C string constant.</p>
|
||
<p>A. Perl isn’t portable enough, or ubiquitous enough.</p>
|
||
<p>D. I’d argue that it is more portable than X. According to the Perl
|
||
folks, it runs on the following platforms: Acorn, AIX, Amiga, AS/400,
|
||
BeOS, Concurrent, Debian, DEC OSF/1, Digital UNIX, EPOC, FreeBSD,
|
||
Guardian, HP-UX, IRIX, LinuxPPC, LynxOS, MacOS, MachTen, Minix, MPE/iX,
|
||
MS-DOS, MVS, NetBSD, Netware, NextStep, OpenBSD, OpenLinux, ODT, OpenVMS,
|
||
OS/2, OS390, OSR, PowerMAX, Psion, QNX, Redhat, Reliant UNIX, RISCOS,
|
||
SCO, SGI, SINIX, Slackware, Solaris, Sun, SuSE, Tandem, Tru64, UNIX,
|
||
U/WIN, Unixware, VMS, Win31, Win32, Windows 3.1, and Windows 95/98/NT/2K.
|
||
Granted, embeddable Perl isn’t quite so portable, but still…</p>
|
||
<p>Also, Perl 5 is bundled with the following OS distributions: AIX 4.3.3+,
|
||
FreeBSD 3.0+, IRIX 6.4+, every Linux distribution, NetBSD, OpenBSD, and
|
||
DEC Tru64 5.0+, again according to the Perl people.</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/
|
||
|
||
-->
|
||
<!-- AFTER: last line of markdown file: 2000/dlowe/README.md -->
|
||
|
||
<!-- 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-2000dlowe">Inventory for 2000/dlowe</h1>
|
||
</div>
|
||
<h2 id="primary-files">Primary files</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/dlowe.c">dlowe.c</a> - entry source code</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/Makefile">Makefile</a> - entry Makefile</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/dlowe.orig.c">dlowe.orig.c</a> - original source code</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/try.sh">try.sh</a> - script to try entry</li>
|
||
</ul>
|
||
<h2 id="secondary-files">Secondary files</h2>
|
||
<ul>
|
||
<li><a href="2000_dlowe.tar.bz2">2000_dlowe.tar.bz2</a> - download entry tarball</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/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/2000/dlowe/.entry.json">.entry.json</a> - entry summary and manifest in JSON</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2000/dlowe/.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/2000/dlowe/.path">.path</a> - directory path from top level directory</li>
|
||
<li><a href="index.html">index.html</a> - this web page</li>
|
||
</ul>
|
||
<hr style="width:10%;text-align:left;margin-left:0">
|
||
<h4>
|
||
Jump to: <a href="#">top</a>
|
||
</h4>
|
||
|
||
<!-- 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.inventory.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"><h3>Copyright © 1984-2024 by Landon Curt Noll:
|
||
<a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">Some Rights Reserved</a></h3>
|
||
<p>
|
||
This work is <b>licensed by Landon Curt Noll</b> under
|
||
<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</a></b>.
|
||
<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"><br>
|
||
You should <b>carefully review</b> the
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">CC BY-SA 4.0 LEGAL CODE</a></b>
|
||
before using the licensed material.<br>
|
||
You may wish to review the
|
||
<b><a href="../../license.html"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">highlights of some of the key features and terms</a></b>
|
||
of <b>CC BY-SA 4.0</b>.<br>
|
||
</p>
|
||
</div>
|
||
|
||
<div id="coda"><h3>Coda</h3>
|
||
<p>
|
||
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2000%2Fdlowe%2Findex.html" rel="nofollow">Nu HTML check this web page</a><br>
|
||
<a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a><br>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/footer.inventory.html -->
|
||
<!-- START: this line starts content from: inc/bottom.default.html -->
|
||
|
||
</body>
|
||
</html>
|
||
|
||
<!-- END: this line ends content from: inc/bottom.default.html -->
|