crcgen.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <inttypes.h>
  2. #include <stdio.h>
  3. int main(int argc, char *argv[])
  4. {
  5. /* Polynomial in bit-reversed notation */
  6. uint64_t poly;
  7. uint64_t crctab[256], v;
  8. int i, j;
  9. poly = strtoumax(argv[1], NULL, 0);
  10. printf("/* C */\n");
  11. printf("static const uint64_t crc64_tab[256] = {\n");
  12. for (i = 0; i < 256; i++) {
  13. v = i;
  14. for (j = 0; j < 8; j++)
  15. v = (v >> 1) ^ ((v & 1) ? poly : 0);
  16. crctab[i] = v;
  17. }
  18. for (i = 0; i < 256; i += 2) {
  19. printf(" /* %02x */ UINT64_C(0x%016"PRIx64"), "
  20. "UINT64_C(0x%016"PRIx64")%s\n",
  21. i, crctab[i], crctab[i+1], (i == 254) ? "" : ",");
  22. }
  23. printf("};\n\n");
  24. printf("# perl\n");
  25. printf("@crc64_tab = (\n");
  26. for (i = 0; i < 256; i += 2) {
  27. printf(" [0x%08"PRIx32", 0x%08"PRIx32"], "
  28. "[0x%08"PRIx32", 0x%08"PRIx32"]%-1s # %02x\n",
  29. (uint32_t)(crctab[i] >> 32),
  30. (uint32_t)(crctab[i]),
  31. (uint32_t)(crctab[i+1] >> 32),
  32. (uint32_t)(crctab[i+1]),
  33. (i == 254) ? "" : ",",
  34. i);
  35. }
  36. printf(");\n");
  37. return 0;
  38. }