sparkcrc.c revision 1.1
11.1Sabs/* $NetBSD: sparkcrc.c,v 1.1 2004/06/08 21:43:40 abs Exp $ */ 21.1Sabs 31.1Sabs/*- 41.1Sabs * Copyright (c) 2001 The NetBSD Foundation, Inc. 51.1Sabs * All rights reserved. 61.1Sabs * 71.1Sabs * This code is derived from software contributed to The NetBSD Foundation 81.1Sabs * by David Brownlee 91.1Sabs * 101.1Sabs * Redistribution and use in source and binary forms, with or without 111.1Sabs * modification, are permitted provided that the following conditions 121.1Sabs * are met: 131.1Sabs * 1. Redistributions of source code must retain the above copyright 141.1Sabs * notice, this list of conditions and the following disclaimer. 151.1Sabs * 2. Redistributions in binary form must reproduce the above copyright 161.1Sabs * notice, this list of conditions and the following disclaimer in the 171.1Sabs * documentation and/or other materials provided with the distribution. 181.1Sabs * 3. All advertising materials mentioning features or use of this software 191.1Sabs * must display the following acknowledgement: 201.1Sabs * This product includes software developed by the NetBSD 211.1Sabs * Foundation, Inc. and its contributors. 221.1Sabs * 4. Neither the name of The NetBSD Foundation nor the names of its 231.1Sabs * contributors may be used to endorse or promote products derived 241.1Sabs * from this software without specific prior written permission. 251.1Sabs * 261.1Sabs * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 271.1Sabs * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 281.1Sabs * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 291.1Sabs * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 301.1Sabs * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 311.1Sabs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 321.1Sabs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 331.1Sabs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 341.1Sabs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 351.1Sabs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 361.1Sabs * POSSIBILITY OF SUCH DAMAGE. 371.1Sabs */ 381.1Sabs 391.1Sabs#include <err.h> 401.1Sabs#include <stdio.h> 411.1Sabs#include <stdlib.h> 421.1Sabs#include <sys/types.h> 431.1Sabs 441.1Sabs/* 451.1Sabs * Trivial progarm to generate a crc suitable for use in a sparkive file 461.1Sabs * Based on an algorithm by David Schwaderer 471.1Sabs */ 481.1Sabs 491.1Sabsuint16_t crclookup[256] = { 501.1Sabs 0, 49345, 49537, 320, 49921, 960, 640, 49729, 50689, 1728, 511.1Sabs 1920, 51009, 1280, 50625, 50305, 1088, 52225, 3264, 3456, 521.1Sabs 52545, 3840, 53185, 52865, 3648, 2560, 51905, 52097, 2880, 531.1Sabs 51457, 2496, 2176, 51265, 55297, 6336, 6528, 55617, 6912, 541.1Sabs 56257, 55937, 6720, 7680, 57025, 57217, 8000, 56577, 7616, 551.1Sabs 7296, 56385, 5120, 54465, 54657, 5440, 55041, 6080, 5760, 561.1Sabs 54849, 53761, 4800, 4992, 54081, 4352, 53697, 53377, 4160, 571.1Sabs 61441, 12480, 12672, 61761, 13056, 62401, 62081, 12864, 581.1Sabs 13824, 63169, 63361, 14144, 62721, 13760, 13440, 62529, 591.1Sabs 15360, 64705, 64897, 15680, 65281, 16320, 16000, 65089, 601.1Sabs 64001, 15040, 15232, 64321, 14592, 63937, 63617, 14400, 611.1Sabs 10240, 59585, 59777, 10560, 60161, 11200, 10880, 59969, 621.1Sabs 60929, 11968, 12160, 61249, 11520, 60865, 60545, 11328, 631.1Sabs 58369, 9408, 9600, 58689, 9984, 59329, 59009, 9792, 8704, 641.1Sabs 58049, 58241, 9024, 57601, 8640, 8320, 57409, 40961, 24768, 651.1Sabs 24960, 41281, 25344, 41921, 41601, 25152, 26112, 42689, 661.1Sabs 42881, 26432, 42241, 26048, 25728, 42049, 27648, 44225, 671.1Sabs 44417, 27968, 44801, 28608, 28288, 44609, 43521, 27328, 681.1Sabs 27520, 43841, 26880, 43457, 43137, 26688, 30720, 47297, 691.1Sabs 47489, 31040, 47873, 31680, 31360, 47681, 48641, 32448, 701.1Sabs 32640, 48961, 32000, 48577, 48257, 31808, 46081, 29888, 711.1Sabs 30080, 46401, 30464, 47041, 46721, 30272, 29184, 45761, 721.1Sabs 45953, 29504, 45313, 29120, 28800, 45121, 20480, 37057, 731.1Sabs 37249, 20800, 37633, 21440, 21120, 37441, 38401, 22208, 741.1Sabs 22400, 38721, 21760, 38337, 38017, 21568, 39937, 23744, 751.1Sabs 23936, 40257, 24320, 40897, 40577, 24128, 23040, 39617, 761.1Sabs 39809, 23360, 39169, 22976, 22656, 38977, 34817, 18624, 771.1Sabs 18816, 35137, 19200, 35777, 35457, 19008, 19968, 36545, 781.1Sabs 36737, 20288, 36097, 19904, 19584, 35905, 17408, 33985, 791.1Sabs 34177, 17728, 34561, 18368, 18048, 34369, 33281, 17088, 801.1Sabs 17280, 33601, 16640, 33217, 32897, 16448 811.1Sabs}; 821.1Sabs 831.1Sabsint 841.1Sabsmain(int argc, char **argv) 851.1Sabs{ 861.1Sabs unsigned char buf[1024]; 871.1Sabs FILE *fds; 881.1Sabs int len; 891.1Sabs int i; 901.1Sabs int crc = 0; 911.1Sabs 921.1Sabs if (argc != 2) { 931.1Sabs fprintf(stderr, "Usage: sparkcrc filename\n"); 941.1Sabs exit(0); 951.1Sabs } 961.1Sabs if (!(fds = fopen(argv[1], "r"))) 971.1Sabs err(1, "Unable to open file '%s'", argv[1]); 981.1Sabs while ((len = fread(buf, 1, sizeof(buf), fds))) 991.1Sabs for (i = 0; i < len; ++i) { 1001.1Sabs crc = (crc >> 8) ^ crclookup[(crc & 0xff) ^ buf[i]]; 1011.1Sabs } 1021.1Sabs fclose(fds); 1031.1Sabs printf("%d\n", (int)crc); 1041.1Sabs return (0); 1051.1Sabs} 106