1//----------------------------------------------------------------------
2//  This software is part of the OpenBeOS distribution and is covered
3//  by the OpenBeOS 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        Reflected version by Jéme Duval
17*/
18
19#include <stdio.h>
20#include <sys/types.h>
21
22typedef unsigned int uint32 ;
23
24uint32
25reflect32 (uint32 b)
26{
27	uint32 rw = 0;
28
29	for (int i = 0; i < 32; i++){
30		if (b & 1)
31			rw |= 1 << (31 - i);
32		b >>= 1;
33	}
34	return rw;
35}
36
37
38int
39main(int argc, char *argv[]) {
40        uint32 crc, poly;
41
42        if (argc != 2) {
43                fprintf(stderr, "USAGE: crc_table <octal polynomial=3667067501 for btrfs>\n");
44                return 0;
45        }
46
47        sscanf(argv[1], "%lo", &poly);
48
49        printf("//! CRC 0%o table, as generated by crc_table.cpp\n", poly);
50        printf("static uint32 crc_table[256] = { \n");
51        for (int n = 0; n < 256; n++) {
52                if (n%8 == 0)
53                        printf("    ");
54                crc = reflect32(n);
55                for (int i = 0; i < 8; i++) {
56                        if (crc & 0x80000000)
57                                crc = (crc << 1) ^ poly;
58                        else
59                                crc <<= 1;
60                }
61		crc = reflect32(crc);
62                printf("0x%08x%s ", crc, (n != 255 ? "," : ""));
63                if (n%8 == 7)
64                        printf("\n");
65        }
66        printf("};\n");
67        return 0;
68}
69