174 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************
 | 
						|
Copyright 1990 by AT&T Bell Laboratories and Bellcore.
 | 
						|
 | 
						|
Permission to use, copy, modify, and distribute this software
 | 
						|
and its documentation for any purpose and without fee is hereby
 | 
						|
granted, provided that the above copyright notice appear in all
 | 
						|
copies and that both that the copyright notice and this
 | 
						|
permission notice and warranty disclaimer appear in supporting
 | 
						|
documentation, and that the names of AT&T Bell Laboratories or
 | 
						|
Bellcore or any of their entities not be used in advertising or
 | 
						|
publicity pertaining to distribution of the software without
 | 
						|
specific, written prior permission.
 | 
						|
 | 
						|
AT&T and Bellcore disclaim all warranties with regard to this
 | 
						|
software, including all implied warranties of merchantability
 | 
						|
and fitness.  In no event shall AT&T or Bellcore be liable for
 | 
						|
any special, indirect or consequential damages or any damages
 | 
						|
whatsoever resulting from loss of use, data or profits, whether
 | 
						|
in an action of contract, negligence or other tortious action,
 | 
						|
arising out of or in connection with the use or performance of
 | 
						|
this software.
 | 
						|
****************************************************************/
 | 
						|
 | 
						|
#include "stdio.h"
 | 
						|
 | 
						|
 char *progname;
 | 
						|
 | 
						|
 void
 | 
						|
usage(rc)
 | 
						|
{
 | 
						|
	fprintf(stderr, "usage: %s [file [file...]]\n", progname);
 | 
						|
	exit(rc);
 | 
						|
	}
 | 
						|
 | 
						|
main(argc, argv)
 | 
						|
 char **argv;
 | 
						|
{
 | 
						|
	int x;
 | 
						|
	char *s;
 | 
						|
	static int rc;
 | 
						|
 | 
						|
	progname = *argv;
 | 
						|
	s = *++argv;
 | 
						|
	if (s && *s == '-') {
 | 
						|
		switch(s[1]) {
 | 
						|
			case '?':
 | 
						|
				usage(0);
 | 
						|
			case '-':
 | 
						|
				break;
 | 
						|
			default:
 | 
						|
				fprintf(stderr, "invalid option %s\n", s);
 | 
						|
				usage(1);
 | 
						|
			}
 | 
						|
		s = *++argv;
 | 
						|
		}
 | 
						|
	if (s) do {
 | 
						|
		x = open(s,0);
 | 
						|
		if (x < 0) {
 | 
						|
			fprintf(stderr, "%s: can't open %s\n", progname, s);
 | 
						|
			rc |= 1;
 | 
						|
			}
 | 
						|
		else
 | 
						|
			process(s, x);
 | 
						|
		}
 | 
						|
		while(s = *++argv);
 | 
						|
	else {
 | 
						|
		process("/dev/stdin", fileno(stdin));
 | 
						|
		}
 | 
						|
	exit(rc);
 | 
						|
	}
 | 
						|
 | 
						|
typedef unsigned char uchar;
 | 
						|
 | 
						|
 long
 | 
						|
sum32(sum, x, n)
 | 
						|
 register long sum;
 | 
						|
 register uchar *x;
 | 
						|
 int n;
 | 
						|
{
 | 
						|
	register uchar *xe;
 | 
						|
	static long crc_table[256] = {
 | 
						|
		0,		151466134,	302932268,	453595578,
 | 
						|
		-9583591,	-160762737,	-312236747,	-463170141,
 | 
						|
		-19167182,	-136529756,	-321525474,	-439166584,
 | 
						|
		28724267,	145849533,	330837255,	448732561,
 | 
						|
		-38334364,	-189783822,	-273059512,	-423738914,
 | 
						|
		47895677,	199091435,	282375505,	433292743,
 | 
						|
		57448534,	174827712,	291699066,	409324012,
 | 
						|
		-67019697,	-184128295,	-300991133,	-418902539,
 | 
						|
		-76668728,	-227995554,	-379567644,	-530091662,
 | 
						|
		67364049,	218420295,	369985021,	520795499,
 | 
						|
		95791354,	213031020,	398182870,	515701056,
 | 
						|
		-86479645,	-203465611,	-388624945,	-506380967,
 | 
						|
		114897068,	266207290,	349655424,	500195606,
 | 
						|
		-105581387,	-256654301,	-340093543,	-490887921,
 | 
						|
		-134039394,	-251295736,	-368256590,	-485758684,
 | 
						|
		124746887,	241716241,	358686123,	476458301,
 | 
						|
		-153337456,	-2395898,	-455991108,	-304803798,
 | 
						|
		162629001,	11973919,	465560741,	314102835,
 | 
						|
		134728098,	16841012,	436840590,	319723544,
 | 
						|
		-144044613,	-26395347,	-446403433,	-329032703,
 | 
						|
		191582708,	40657250,	426062040,	274858062,
 | 
						|
		-200894995,	-50223749,	-435620671,	-284179369,
 | 
						|
		-172959290,	-55056048,	-406931222,	-289830788,
 | 
						|
		182263263,	64630089,	416513267,	299125861,
 | 
						|
		229794136,	78991822,	532414580,	381366498,
 | 
						|
		-220224191,	-69691945,	-523123603,	-371788549,
 | 
						|
		-211162774,	-93398532,	-513308602,	-396314416,
 | 
						|
		201600371,	84090341,	503991391,	386759881,
 | 
						|
		-268078788,	-117292630,	-502591472,	-351526778,
 | 
						|
		258520357,	107972019,	493278217,	341959839,
 | 
						|
		249493774,	131713432,	483432482,	366454964,
 | 
						|
		-239911657,	-122417791,	-474129349,	-356881235,
 | 
						|
		-306674912,	-457198666,	-4791796,	-156118374,
 | 
						|
		315967289,	466778031,	14362133,	165418627,
 | 
						|
		325258002,	442776452,	23947838,	141187752,
 | 
						|
		-334573813,	-452329571,	-33509849,	-150495567,
 | 
						|
		269456196,	419996626,	33682024,	184992510,
 | 
						|
		-278767779,	-429561909,	-43239823,	-194312473,
 | 
						|
		-288089226,	-405591072,	-52790694,	-170046772,
 | 
						|
		297394031,	415166457,	62373443,	179343061,
 | 
						|
		383165416,	533828478,	81314500,	232780370,
 | 
						|
		-373594127,	-524527769,	-72022307,	-223201717,
 | 
						|
		-401789990,	-519431348,	-100447498,	-217810336,
 | 
						|
		392228803,	510123861,	91131631,	208256633,
 | 
						|
		-345918580,	-496598246,	-110112096,	-261561802,
 | 
						|
		336361365,	487278339,	100800185,	251995695,
 | 
						|
		364526526,	482151208,	129260178,	246639108,
 | 
						|
		-354943065,	-472854735,	-119955829,	-237064675,
 | 
						|
		459588272,	308539942,	157983644,	7181066,
 | 
						|
		-469170519,	-317835713,	-167286907,	-16754925,
 | 
						|
		-440448382,	-323454444,	-139383890,	-21619912,
 | 
						|
		450006683,	332774925,	148697015,	31186721,
 | 
						|
		-422325548,	-271261118,	-186797064,	-36011154,
 | 
						|
		431888077,	280569435,	196114401,	45565815,
 | 
						|
		403200742,	286222960,	168180682,	50400092,
 | 
						|
		-412770561,	-295522711,	-177471533,	-59977915,
 | 
						|
		-536157576,	-384970002,	-234585260,	-83643454,
 | 
						|
		526853729,	375396087,	225003341,	74348507,
 | 
						|
		517040714,	399923932,	215944038,	98057200,
 | 
						|
		-507728301,	-390357307,	-206385281,	-88735767,
 | 
						|
		498987548,	347783818,	263426864,	112501670,
 | 
						|
		-489671163,	-338229613,	-253864151,	-103192641,
 | 
						|
		-479823314,	-362722632,	-244835582,	-126932076,
 | 
						|
		470531639,	353144481,	235265819,	117632909
 | 
						|
		};
 | 
						|
 | 
						|
	xe = x + n;
 | 
						|
	while(x < xe)
 | 
						|
		sum = crc_table[(sum ^ *x++) & 0xff] ^ (sum >> 8 & 0xffffff);
 | 
						|
	return sum;
 | 
						|
	}
 | 
						|
 | 
						|
process(s, x)
 | 
						|
 char *s;
 | 
						|
 int x;
 | 
						|
{
 | 
						|
	register int n;
 | 
						|
	uchar buf[16*1024];
 | 
						|
	long fsize, sum;
 | 
						|
 | 
						|
	sum = 0;
 | 
						|
	fsize = 0;
 | 
						|
	while((n = read(x, (char *)buf, sizeof(buf))) > 0) {
 | 
						|
		fsize += n;
 | 
						|
		sum = sum32(sum, buf, n);
 | 
						|
		}
 | 
						|
	sum &= 0xffffffff;
 | 
						|
        if (n==0)
 | 
						|
		printf("%s\t%lx\t%ld\n", s, sum & 0xffffffff, fsize);
 | 
						|
        else { perror(s); }
 | 
						|
	close(x);
 | 
						|
	return(0);
 | 
						|
	}
 |