The mobile About menu was missing the IOCCC markdown guidelines. This has been added to the mobile menu but moved to 'Status' which is where guidelines are (it has been renamed to be 'IOCCC Markdown Guidelines' to match the style of the other items in that menu). The About menu now has two more links, one for the website tools and the other for the include files of the tools. It might be, looking at the generated html files, better to have another menu instead, but what that should be is unclear. The reason it might be better is because the 'About' menu is rather long. In retrospect it might be better to not have the script include files in the html files but this can be decided and dealt with later. The script bin/find-missing-links.sh now ignores the directory NOTES/. A better approach might be using git ls-files --exclude but a quick test did not work right. Another option, at least for NOTES/, might be to use 'git ls-files --exclude-standard'. The bin/index.html file has been updated. Run make www to rebuild all html files.
To build:
make
Bugs and (Mis)features:
The current status of this entry is:
STATUS: doesn't work with some platforms - please help us fix it
For more detailed information see 2011/richards in bugs.html.
To use:
echo expression | ./richards
Try:
./try.sh
Judges' remarks:
Oh no, yet another
dc-style calculator? (see
2000/dlowe using an embedded Perl interpreter and deemed Worst Abuse of the Rules). Well, this one does it (expression calculation, that is,
not the rule abuse) in a different way. The author claims that his calculator
does just-in-time compilation. What would you do to prove or disprove his claim
without attempting to unravel the source?
Author's remarks:
This is an implementation of the classic UNIX
dc command, the
reverse Polish
calculator. Actually it's a pretty bad implementation, since it only implements
32-bit integers (well, sizeof(int)-sized integers). It only implements the
commands +, -, *, /, p (only for numbers), register stacks, macros and
comparisons. Wow, you'd think I could've done better in 2K of code.
OH! I forgot to mention! It's a JIT.
Wait, don't stop reading! I know what you're thinking, platform-specific code is discouraged in IOCCC. But do you see any platform-specific code? There's no assembler here! This JIT works on a dozen platforms, and the only platform-specific assumptions it makes are that the stack grows down and integers are at least 32-bit.
You will probably get warnings while compiling the code. In particular:
-
If your system requires the inclusion of
alloca.hto use alloca, use the compile flag-DAH. -
If your system cannot use
mmap(), use the compile flag-DNM. -
I don't include any headers I don't strictly need to, so you'll get warnings about (at least)
memcpy(),isdigit(),atoi(),calloc(),malloc()andalloca()if you didn't use-DAH. - NOTE from judges: we added these includes in 2023. -
GCC likes to complain about
while (a = b)(assignments as a condition). -
I don't return from
main(), even though it's declared to returnint.
Platforms on which all known/tested optimization levels work with no additional flags:
- gcc 4.6.2 + x86[_64] + GNU/Linux, Mac OS X or Windows
- clang 2.9-16 + x86[_64] + GNU/Linux or Mac OS X
- tcc 0.9.25
- gcc 4.4.5 + alpha, arm, mips[el], powerpc[64], s390x (IBM zSeries)
- gcc 4.1.3 + vax + NetBSD
Platforms which work but not at all optimization levels or needing special flags:
- owcc 1.9 + x86 + Windows: Needs
-DNM -DAH -fno-stack-check - gcc 4.4.5 + sh4:
-O0works, higher optimization levels don't work for unknown reasons.