1//----------------------------------------------------------------------
2//  This software is part of the Haiku distribution and is covered
3//  by the MIT License.
4//
5//  Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
6//---------------------------------------------------------------------
7
8/*! \file crc_table.cpp
9
10	Standalone program to generate the CRC table used for calculating
11	UDF tag id CRC values.
12
13	This code based off of crc code in UDF-2.50 specs, as permitted.
14	See UDF-2.50 6.5 for more information.
15*/
16
17#include <stdio.h>
18
19int
20main(int argc, char *argv[]) {
21	ulong crc, poly;
22
23	if (argc != 2) {
24		fprintf(stderr, "USAGE: crc_table <octal polynomial=010041 for UDF>\n");
25		return 0;
26	}
27
28	sscanf(argv[1], "%lo", &poly);
29	if (poly & 0xffff0000) {
30		fprintf(stderr, "ERROR: polynomial is too large, sucka.\n");
31		return 0;
32	}
33
34	printf("//! CRC 0%o table, as generated by crc_table.cpp\n", poly);
35	printf("static uint16 crc_table[256] = { \n");
36	for (int n = 0; n < 256; n++) {
37		if (n%8 == 0)
38			printf("    ");
39		crc = n << 8;
40		for (int i = 0; i < 8; i++) {
41			if (crc & 0x8000)
42				crc = (crc << 1) ^ poly;
43			else
44				crc <<= 1;
45			crc &= 0xffff;
46		}
47		printf("0x%04x%s ", crc, (n != 255 ? "," : ""));
48		if (n%8 == 7)
49			printf("\n");
50	}
51	printf("};\n");
52	return 0;
53}
54