IOCCC image by Matt Zucker

The International Obfuscated C Code Contest

1998/tomtorfs - Best self-documenting

CRC generator

Author:

To build:

    make all

To use:

    ./tomtorfs filename bitwidth polynom reflected init xor

where:

Try:

    ./try.sh

Judges’ remarks:

If you don’t believe the program is correct, try and compare the output of the program with the value of CRCs computed by PKZIP or any other archiver that uses the CRC-32 algorithm.

Author’s remarks:

Usage:

    ./tomtorfs filename bitwidth polynom reflected init xor

where:

Examples

CRC-16:

    ./tomtorfs filename 16 1021 0 FFFF 0000

CRC-32:

    ./tomtorfs filename 32 04C11DB7 1 FFFFFFFF FFFFFFFF

XMODEM:

    ./tomtorfs filename 16 8408 1 0000 0000

ARC:

    ./tomtorfs filename 16 8005 1 0000 0000

Portability notes

The program assumes CHAR_BIT==8. Results are undefined if bitwidth > sizeof(unsigned long) * 8. It is also assumed that EOF is -1 and 1 is a valid exit value to indicate failure (replace them with EOF resp. EXIT_FAILURE if the assumptions are false). Otherwise ANSI/ISO C.

No special build options required.

Special notes

Count the number of non-whitespace characters in the source file to find out what dark force drove me to write this ;-).

NOTICE to those who wish for a greater challenge:

If you want a greater challenge, don’t read any further: just try to understand the program via the source.

If you get stuck, come back and read below for additional hints and information.

How this entry works:

First of all, if you run a C beautifier on the program (thereby of course losing the nice code shape I worked so hard on ;-) ) the code will become a bit more readable.

The variable names are not very descriptive. They have the following meanings:

The first for loop simply reads the command-line arguments in the b[] array. The third parameter to strtoul(3) causes all arguments to be in base-16 (hex) except the first one, which will be in base-10 (decimal).

The rest of the program “simply” calculates the CRC in b[5] and then prints it to stdout. The bit reflection loops may appear a bit tricky at first, but if you have a good look at them they should become obvious also.

Acknowledgments:

Ross N. Williams, whose CRC guide was very useful to me for writing this. You can find it in crc.txt.

Inventory for 1998/tomtorfs

Primary files

Secondary files


Jump to: top