Entry source is now prog.c for IOCCC years 2014 thru 2020, or is now dirname.c IOCCC years 1984 thru 2013. To achieve this state, we renamed the following: renamed: 2004/hibachi/src/hibachi.c -> 2004/hibachi/hibachi.c renamed: 2012/omoikane/nyaruko.alt.c -> 2012/omoikane/omoikane.alt.c renamed: 2012/omoikane/nyaruko.alt2.c -> 2012/omoikane/omoikane.alt2.c renamed: 2012/omoikane/nyaruko.c -> 2012/omoikane/omoikane.c renamed: 2012/omoikane/nyaruko.orig.c -> 2012/omoikane/omoikane.orig.c Modified `bin/subst.entry-index.sh` to add to entry `index.html` file, links to the `Makefile` and the _C code_ to the top navigation bar. Changed `bin/subst.entry-index.sh` VERSION from "1.2.2 2024-02-25" to "1.3 2024-03-02". Moved printing the Inventory link in the top navigation bar from `bin/subst.entry-navbar.awk` to `bin/subst.entry-index.sh`. Changed `bin/subst.entry-navbar.awk` VERSION from "1.0.1 2024-02-23" to "1.1 2024-03-02". Moved printing the Inventory link in the top navigation bar from `bin/subst.year-navbar.awk` to `bin/subst.year-index.sh`. Changed `bin/subst.year-index.sh` VERSION from "1.0 2024-02-11" to "1.1 2024-03-02". Changed `bin/subst.year-navbar.awk` VERSION from "1.0 2024-02-11" to "1.1 2024-03-02". Added location names (both default and common) to `author.html`. Changed `tmp/gen_author_json.sh` VERSION from "1.0 2023-06-06" to "1.1 2024-03-04". Added location names (both default and common) to `author.html`. Changed `bin/gen-authors.sh` VERSION from "1.2 2024-03-09" to "1.3 2024-03-04". The manifest and the resulting `.entry.json` files have been changed for `2004/hibachi` and `2012/omoikane`. The Makefiles for `2004/hibachi` and `2012/omoikane` copy the source file into the "previously used location". The `make clobber` rule removes the copied source. The `.gitignore` files have been updated accordingly. Improved how the concept of IOCCC terms _entry_, _author_ and _submission_ are used in markdown files. Links to markdown files (files ending in .md) within the repo were changed to link to HTML files (files ending in .html). Special cases where `README.md` became `index.html` were modified accordingly. Fixed URL for `bugs.html` in Makefile comments. Fixed name of `bin/sgi.sh` referenced in comments in `.gitignore` files. Links to locations within the repo are now relative. For example a link to `/contact.html` may become `../contact.html' or '../../contact.html` depending on the directory level of the markdown file. Nearly all links with absolute URLs under _https://www.ioccc.org_ or `https://ioccc-src.github.io/temp-test-ioccc_ have been changed to relative paths within the repo. Some exceptions to this (such as referring to a GitHub repo) were preserved. Fixed a number of inside `faq.md` and `bugs.md`. Added HTML name tags (in the form of an _entry_id_) for each entry referenced in `bugs.md`. Fixed links from outside of `bugs.html` into `bugs.html` accordingly. Where FAQ entries are referenced, a named tag is used so that if a FAQ is ever renumbered, links outside of `faq.html` will still work. Changed the _inventory_order_ of a compressed tarball from _300_ to _100000_. While this may have been done for the manifest, this changed had not yet been propagated into the `.entry.json` files. Links to web sites that were in the for <URL> are now [URL](URL). Performed `name www` to process all of the above. Improved format of `authors.html`. Full names are now bold. Location codes are now links back into `location.html` and location names (both default and common) are now italics. Added _author_handle_ each author. Changed `bin/gen-authors.sh` VERSION from "1.1 2024-02-25" to "1.2 2024-03-09". Improved format of `location.html` as location codes are now bold, author counts in a given location are now bold, and location names (both default and common) are now italics. Changed `bin/gen-location.sh` VERSION from "1.0.1 2024-02-23" to "1.1 2024-03-04". Added italic location name after location code in entry `index.html` files. Changed `bin/output-index-author.sh` VERSION from "1.4.1 2024-02-23" to "1.5 2024-03-04". Added _Location of authors_ to the sidebar as a link to `location.html`. TODO: While nearly all of the above mentioned changes are likely correct, they likely introduced a few errors that need correcting.
To build:
make
There is an alternate version that compiles mkentry.c. See alternate code.
To use:
./tomx
Try:
./try.sh
Alternate code:
This alternate code is based on the author's remarks with a slight fix so that
it will do what it once did, compile and run mkentry.c. You can use
it in a similar way as tomx.c, both executing the source file and
using it as a Makefile and running the code ends up running mkentry.
Alternate build:
make alt
Alternate try:
./try.alt.sh
Judges' remarks:
Polyglots have come and gone, but this was the first one we'd seen where one language used another to perform its tasks. An interesting approach. Admittedly, it's not all that obfuscated - but there's more to it than you might think, since you have to make sure that your changes don't change the shell code or the Makefile.
Author's remarks:
Summary
This program works as a C source file, a Makefile and also as a shell
(/bin/sh) script. But unlike some other multi-language programs, this one is
NOT meant to print Hello, world in all 3 cases (At least in the true sense
;-)). The C, Makefile and shell code build upon each other to create a C program (?)
which when executed as a shell script will compile itself through the C compiler
using a Makefile! - Pretty useful, Eh?
Probably, this is the first entry ever to fully satisfy Rule #1 ("Your entry must be a complete program") in the strictest sense;-)
Top 5 reasons (IMHO) why this code is an entry for IOCCC
-
A glance at the source itself will tell you that most of the Obfuscation is NOT in the C code per se, but in the comments to the C code. (But sadly, I could not find an "International Obfuscated C COMMENT contest". So I HAD to send this entry here to the IOCCC itself).
-
Of the 3 languages in the source, the least obfuscated is C (But again, there was NO obfuscated make/shscript contest) (Does this hint for a rule in IOCCC-2001 that the major obfuscation should be in C and not elsewhere???. Mmmmm...).
-
Extending Argument #2... Obfuscation done in the C code (comments?) creates obfuscated code for the other 2 languages. This opens new possibilities to be explored in depth in future
IOCCCs. -
LOOKS like a Makefile, WORKS like a shell script and COMPILES like a C program.
-
Does something useful (See Notes #1 and #2 below).
Notes
- The program could have been something other than the simple "Hello, world"
program that it is. It is possible to do
#include "prog2.c"in the place of themain(), leaving the complexities of the C file elsewhere and making this source still acceptable tomakeandsh. The following modification to the last few lines will compile the IOCCC's famous mkentry.c.
.PHONY: /* true clean */
#undef true
#include "mkentry.c"
Ain't that useful?
-
By extending this program's idea, It is possible to do some very interesting things like generating C code on execution by adding additional code in make/sh (open up a loop????). This opens the possibilities of generating & compiling some (obfuscated?) C code. (Maybe should try this if this program fails at IOCCC 2000)
-
Changing the
%:%.cdependency to a$(PROG):$(PROG).cform can compile this program with some othermakes (I got it to work in Windows using nmake and Gnuwin32's sh ;-) ) -
Interesting things to do: try
./tomx.c clean. This will do the same asmake clean:-)). Also:./tomx.c all -
Be careful about the tabs in the source code. Removing them or converting tabs to spaces can be disastrous.
Copyright and CC BY-SA 4.0 License:
This file is Copyright (c) 2023 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/