xref: /csrg-svn/games/adventure/crc.c (revision 60730)
160079Sbostic /*-
2*60730Sbostic  * Copyright (c) 1993
3*60730Sbostic  *	The Regents of the University of California.  All rights reserved.
460079Sbostic  *
560079Sbostic  * This code is derived from software contributed to Berkeley by
660079Sbostic  * James W. Williams of the University of Maryland.
760079Sbostic  *
860079Sbostic  * %sccs.include.redist.c%
960079Sbostic  */
1060079Sbostic 
1160079Sbostic #ifndef lint
12*60730Sbostic static char sccsid[] = "@(#)crc.c	8.1 (Berkeley) 05/31/93";
1360079Sbostic static char ORIGINAL_sccsid[] = "@(#)crc.c	5.2 (Berkeley) 4/4/91";
1460079Sbostic #endif /* not lint */
1560079Sbostic 
1660079Sbostic typedef	unsigned long	u_long;
1760079Sbostic 
1860079Sbostic u_long crctab[] = {
1960079Sbostic 	0x7fffffff,
2060079Sbostic 	0x77073096,  0xee0e612c,  0x990951ba,  0x076dc419,  0x706af48f,
2160079Sbostic 	0xe963a535,  0x9e6495a3,  0x0edb8832,  0x79dcb8a4,  0xe0d5e91e,
2260079Sbostic 	0x97d2d988,  0x09b64c2b,  0x7eb17cbd,  0xe7b82d07,  0x90bf1d91,
2360079Sbostic 	0x1db71064,  0x6ab020f2,  0xf3b97148,  0x84be41de,  0x1adad47d,
2460079Sbostic 	0x6ddde4eb,  0xf4d4b551,  0x83d385c7,  0x136c9856,  0x646ba8c0,
2560079Sbostic 	0xfd62f97a,  0x8a65c9ec,  0x14015c4f,  0x63066cd9,  0xfa0f3d63,
2660079Sbostic 	0x8d080df5,  0x3b6e20c8,  0x4c69105e,  0xd56041e4,  0xa2677172,
2760079Sbostic 	0x3c03e4d1,  0x4b04d447,  0xd20d85fd,  0xa50ab56b,  0x35b5a8fa,
2860079Sbostic 	0x42b2986c,  0xdbbbc9d6,  0xacbcf940,  0x32d86ce3,  0x45df5c75,
2960079Sbostic 	0xdcd60dcf,  0xabd13d59,  0x26d930ac,  0x51de003a,  0xc8d75180,
3060079Sbostic 	0xbfd06116,  0x21b4f4b5,  0x56b3c423,  0xcfba9599,  0xb8bda50f,
3160079Sbostic 	0x2802b89e,  0x5f058808,  0xc60cd9b2,  0xb10be924,  0x2f6f7c87,
3260079Sbostic 	0x58684c11,  0xc1611dab,  0xb6662d3d,  0x76dc4190,  0x01db7106,
3360079Sbostic 	0x98d220bc,  0xefd5102a,  0x71b18589,  0x06b6b51f,  0x9fbfe4a5,
3460079Sbostic 	0xe8b8d433,  0x7807c9a2,  0x0f00f934,  0x9609a88e,  0xe10e9818,
3560079Sbostic 	0x7f6a0dbb,  0x086d3d2d,  0x91646c97,  0xe6635c01,  0x6b6b51f4,
3660079Sbostic 	0x1c6c6162,  0x856530d8,  0xf262004e,  0x6c0695ed,  0x1b01a57b,
3760079Sbostic 	0x8208f4c1,  0xf50fc457,  0x65b0d9c6,  0x12b7e950,  0x8bbeb8ea,
3860079Sbostic 	0xfcb9887c,  0x62dd1ddf,  0x15da2d49,  0x8cd37cf3,  0xfbd44c65,
3960079Sbostic 	0x4db26158,  0x3ab551ce,  0xa3bc0074,  0xd4bb30e2,  0x4adfa541,
4060079Sbostic 	0x3dd895d7,  0xa4d1c46d,  0xd3d6f4fb,  0x4369e96a,  0x346ed9fc,
4160079Sbostic 	0xad678846,  0xda60b8d0,  0x44042d73,  0x33031de5,  0xaa0a4c5f,
4260079Sbostic 	0xdd0d7cc9,  0x5005713c,  0x270241aa,  0xbe0b1010,  0xc90c2086,
4360079Sbostic 	0x5768b525,  0x206f85b3,  0xb966d409,  0xce61e49f,  0x5edef90e,
4460079Sbostic 	0x29d9c998,  0xb0d09822,  0xc7d7a8b4,  0x59b33d17,  0x2eb40d81,
4560079Sbostic 	0xb7bd5c3b,  0xc0ba6cad,  0xedb88320,  0x9abfb3b6,  0x03b6e20c,
4660079Sbostic 	0x74b1d29a,  0xead54739,  0x9dd277af,  0x04db2615,  0x73dc1683,
4760079Sbostic 	0xe3630b12,  0x94643b84,  0x0d6d6a3e,  0x7a6a5aa8,  0xe40ecf0b,
4860079Sbostic 	0x9309ff9d,  0x0a00ae27,  0x7d079eb1,  0xf00f9344,  0x8708a3d2,
4960079Sbostic 	0x1e01f268,  0x6906c2fe,  0xf762575d,  0x806567cb,  0x196c3671,
5060079Sbostic 	0x6e6b06e7,  0xfed41b76,  0x89d32be0,  0x10da7a5a,  0x67dd4acc,
5160079Sbostic 	0xf9b9df6f,  0x8ebeeff9,  0x17b7be43,  0x60b08ed5,  0xd6d6a3e8,
5260079Sbostic 	0xa1d1937e,  0x38d8c2c4,  0x4fdff252,  0xd1bb67f1,  0xa6bc5767,
5360079Sbostic 	0x3fb506dd,  0x48b2364b,  0xd80d2bda,  0xaf0a1b4c,  0x36034af6,
5460079Sbostic 	0x41047a60,  0xdf60efc3,  0xa867df55,  0x316e8eef,  0x4669be79,
5560079Sbostic 	0xcb61b38c,  0xbc66831a,  0x256fd2a0,  0x5268e236,  0xcc0c7795,
5660079Sbostic 	0xbb0b4703,  0x220216b9,  0x5505262f,  0xc5ba3bbe,  0xb2bd0b28,
5760079Sbostic 	0x2bb45a92,  0x5cb36a04,  0xc2d7ffa7,  0xb5d0cf31,  0x2cd99e8b,
5860079Sbostic 	0x5bdeae1d,  0x9b64c2b0,  0xec63f226,  0x756aa39c,  0x026d930a,
5960079Sbostic 	0x9c0906a9,  0xeb0e363f,  0x72076785,  0x05005713,  0x95bf4a82,
6060079Sbostic 	0xe2b87a14,  0x7bb12bae,  0x0cb61b38,  0x92d28e9b,  0xe5d5be0d,
6160079Sbostic 	0x7cdcefb7,  0x0bdbdf21,  0x86d3d2d4,  0xf1d4e242,  0x68ddb3f8,
6260079Sbostic 	0x1fda836e,  0x81be16cd,  0xf6b9265b,  0x6fb077e1,  0x18b74777,
6360079Sbostic 	0x88085ae6,  0xff0f6a70,  0x66063bca,  0x11010b5c,  0x8f659eff,
6460079Sbostic 	0xf862ae69,  0x616bffd3,  0x166ccf45,  0xa00ae278,  0xd70dd2ee,
6560079Sbostic 	0x4e048354,  0x3903b3c2,  0xa7672661,  0xd06016f7,  0x4969474d,
6660079Sbostic 	0x3e6e77db,  0xaed16a4a,  0xd9d65adc,  0x40df0b66,  0x37d83bf0,
6760079Sbostic 	0xa9bcae53,  0xdebb9ec5,  0x47b2cf7f,  0x30b5ffe9,  0xbdbdf21c,
6860079Sbostic 	0xcabac28a,  0x53b39330,  0x24b4a3a6,  0xbad03605,  0xcdd70693,
6960079Sbostic 	0x54de5729,  0x23d967bf,  0xb3667a2e,  0xc4614ab8,  0x5d681b02,
7060079Sbostic 	0x2a6f2b94,  0xb40bbe37,  0xc30c8ea1,  0x5a05df1b,  0x2d02ef8d
7160079Sbostic };
7260079Sbostic 
7360079Sbostic /*
7460079Sbostic  * crc --
7560079Sbostic  *      Compute a POSIX.2 checksum.  This routine modified by Jim Gillogly
7660079Sbostic  *      to work on sequential data rather than on a file.  Initial call to
7760079Sbostic  *      crc_start initializes the sum, and subsequent calls to crc update
7860079Sbostic  *      it.
7960079Sbostic  */
8060079Sbostic 
8160079Sbostic u_long crcval;
8260079Sbostic int step;
8360079Sbostic 
crc_start()8460079Sbostic crc_start()
8560079Sbostic {
8660079Sbostic 	crcval = step = 0;
8760079Sbostic }
8860079Sbostic 
crc(ptr,nr)8960079Sbostic u_long crc(ptr, nr) /* Process nr bytes at a time; ptr points to them */
9060079Sbostic char *ptr;
9160079Sbostic int nr;
9260079Sbostic {
9360079Sbostic 	register int i;
9460079Sbostic 	register char *p;
9560079Sbostic 
9660079Sbostic 	while (nr > 0)
9760079Sbostic 		for (p = ptr; nr--; ++p)
9860079Sbostic 		{
9960079Sbostic 			if (!(i = crcval >> 24 ^ *p))
10060079Sbostic 			{
10160079Sbostic 				i = step++;
10260079Sbostic 				if (step >= sizeof(crctab)/sizeof(crctab[0]))
10360079Sbostic 					step = 0;
10460079Sbostic 			}
10560079Sbostic 			crcval = (crcval << 8) ^ crctab[i];
10660079Sbostic 		}
10760079Sbostic 	return crcval & 0xffffffff;               /* Mask to 32 bits. */
10860079Sbostic }
109