00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <sys/types.h>
00010 #include <fcntl.h>
00011 #include <unistd.h>
00012 #include <stdio.h>
00013
00014 int error;
00015
00016
00017
00018
00019 unsigned long crctab[] = {
00020 0x7fffffff,
00021 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
00022 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e,
00023 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
00024 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
00025 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
00026 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63,
00027 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
00028 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
00029 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
00030 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180,
00031 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
00032 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
00033 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
00034 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5,
00035 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
00036 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
00037 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
00038 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
00039 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
00040 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541,
00041 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc,
00042 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
00043 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
00044 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e,
00045 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
00046 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
00047 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
00048 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b,
00049 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
00050 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671,
00051 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
00052 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
00053 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
00054 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
00055 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
00056 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
00057 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
00058 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b,
00059 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
00060 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
00061 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
00062 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8,
00063 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
00064 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff,
00065 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee,
00066 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
00067 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
00068 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c,
00069 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
00070 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
00071 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
00072 };
00073
00074 _PROTOTYPE(int main, (int argc, char **argv));
00075 _PROTOTYPE(void crc, (int fd, char *name));
00076 _PROTOTYPE(unsigned long strncrc, (unsigned char *b, int n, unsigned long s));
00077
00078 static int aux;
00079
00080
00081 unsigned long strncrc(b, n, s)
00082 register unsigned char *b;
00083 register int n;
00084 register unsigned long s;
00085 {
00086 register int i;
00087
00088 while (n-- > 0) {
00089
00090 i = (s >> 24) ^ ((unsigned int) (*b++));
00091
00092 if (i == 0) {
00093
00094
00095 i = aux++;
00096 if (aux >= sizeof(crctab) / sizeof(crctab[0])) aux = 0;
00097 }
00098
00099
00100 s = (s << 8) ^ crctab[i];
00101 }
00102 return(s);
00103 }
00104
00105
00106 int main(argc, argv)
00107 int argc;
00108 char *argv[];
00109 {
00110 argc--;
00111 error = 0;
00112 if (!argc)
00113 crc(0, (char *) 0);
00114 else
00115 for (argv++; argc--; argv++) crc(open(*argv, O_RDONLY), *argv);
00116 return(error);
00117 }
00118
00119
00120 void crc(fd, name)
00121 int fd;
00122 char *name;
00123 {
00124 off_t f_size;
00125 unsigned long crc;
00126 int nb;
00127 unsigned char buffer[1024];
00128
00129 if (fd < 0) {
00130 perror(name);
00131 error = 1;
00132 return;
00133 }
00134 crc = 0;
00135 f_size = 0;
00136 aux = 0;
00137 for (;;) {
00138 nb = read(fd, (char *) buffer, sizeof(buffer));
00139 if (nb < 0) {
00140 close(fd);
00141 perror(name ? name : "stdin");
00142 error = 1;
00143 return;
00144 }
00145 if (!nb) break;
00146 f_size += nb;
00147 crc = strncrc(buffer, nb, crc);
00148 }
00149 close(fd);
00150 printf("%lu %ld", crc, f_size);
00151 if (name)
00152 printf(" %s\n", name);
00153 else
00154 putchar('\n');
00155 }