diff options
author | polwex <polwex@sortug.com> | 2025-10-05 21:56:51 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-10-05 21:56:51 +0700 |
commit | fcedfddf00b3f994e4f4e40332ac7fc192c63244 (patch) | |
tree | 51d38e62c7bdfcc5f9a5e9435fe820c93cfc9a3d /vere/ext/nasm/misc/xcrcgen.c |
claude is gud
Diffstat (limited to 'vere/ext/nasm/misc/xcrcgen.c')
-rw-r--r-- | vere/ext/nasm/misc/xcrcgen.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/vere/ext/nasm/misc/xcrcgen.c b/vere/ext/nasm/misc/xcrcgen.c new file mode 100644 index 0000000..0198480 --- /dev/null +++ b/vere/ext/nasm/misc/xcrcgen.c @@ -0,0 +1,79 @@ +/* + * Produce a "generalized CRC" table. Assumes a platform with + * /dev/urandom -- otherwise reimplement get_random_byte(). + */ + +#include <errno.h> +#include <fcntl.h> +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +static uint8_t get_random_byte(void) +{ + static int fd = -1; + uint8_t buf; + int rv; + + if (fd < 0) + fd = open("/dev/urandom", O_RDONLY); + + do { + errno = 0; + rv = read(fd, &buf, 1); + if (rv < 1 && errno != EAGAIN) + abort(); + } while (rv < 1); + + return buf; +} + +static void random_permute(uint8_t *buf) +{ + int i, j, k; + int m; + + for (i = 0; i < 256; i++) + buf[i] = i; + + m = 255; + for (i = 255; i > 0; i--) { + if (i <= (m >> 1)) + m >>= 1; + do { + j = get_random_byte() & m; + } while (j > i); + k = buf[i]; + buf[i] = buf[j]; + buf[j] = k; + } +} + +static void xcrc_table(uint64_t *buf) +{ + uint8_t perm[256]; + int i, j; + + memset(buf, 0, 8*256); /* Make static checkers happy */ + + for (i = 0; i < 8; i++) { + random_permute(perm); + for (j = 0; j < 256; j++) + buf[j] = (buf[j] << 8) | perm[j]; + } +} + +int main(void) +{ + int i; + uint64_t buf[256]; + + xcrc_table(buf); + + for (i = 0; i < 256; i++) { + printf("%016"PRIx64"\n", buf[i]); + } + + return 0; +} |