A number of rules have been moved from entry `Makefile`s into the `1337.mk` include file to make it easier for these common rules to be updated or modified globally (by modifying the `1337.mk` include file). The entry level `Makefile`s are now similar in form to the /Makefile.example](https://github.com/ioccc-src/mkiocccentry/blob/master/Makefile.example) file from the other repo. The following make rules were moved into the `1337.mk` include file: - `make indent.c` - `make install` - `make diff_orig_prog` - `make diff_prog_orig` - `make diff_alt_prog` - `make diff_prog_alt` This simplifies the entry level `Makefile`s so that they mostly reflect the specifics of the particular entry. Mentioned in FAQ 4.2, that the make diff rules are in the `1337.mk` include file. Fixed invalid TAB character in `faq.md`. Removed `make clean` directives that removed `indent.c`. This file is now removed via `make indent_clean`, a clean rule that also removes `indent.c`. Removed `make clobber` directives that removed sandwich, This file is now removed via `make indent_clobber`, a clean rule that also removes `sandwich`. Added `make indent_clean` and `make indent_clobber` rules into the top level `Makefile` and the year level `YYYY/Makefile`. Performed `make quick_www` to accomplish the above and to test under macOS.
To build:
make all
To use:
./tomtorfs filename bitwidth polynom reflected init xor
where:
filename- file to calculate the CRC of
bitwidth- width of the CRC in bits (decimal)
polynom- polynomial used for the CRC (hexadecimal)
reflected- 0 if the CRC is not reflected, 1 if it is
init- initial value for the CRC (hexadecimal)
xor- value to xor the final CRC with (hexadecimal)
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:
filename- file to calculate the CRC of
bitwidth- width of the CRC in bits (decimal)
polynom- polynomial used for the CRC (hexadecimal)
reflected- 0 if the CRC is not reflected, 1 if it is
init- initial value for the CRC (hexadecimal)
xor- value to xor the final CRC with (hexadecimal)
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:
-
a- argc
-
A- argv
-
b- array of
unsigned longvariables:
b[0]- bit-width of the CRC (
argv[2])
- bit-width of the CRC (
b[1]- CRC polynomial (
argv[3])
- CRC polynomial (
b[2]- nonzero if CRC is reflected (argv[4])
b[3]- initial value of CRC (argv[5])
b[4]- value final CRC is XORed with (argv[6])
b[5]- CRC value
b[6]- byte from file
b[7]- counter
- array of
-
BFILE *through which the fileargv[1]is opened
-
Ctypedefforunsigned long
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.