File Coverage

CRC32.xs
Criterion Covered Total %
statement 32 34 94.1
branch 16 20 80.0
condition n/a
subroutine n/a
pod n/a
total 48 54 88.8


line stmt bran cond sub pod time code
1             /*
2             Perl Extension for 32bit CRC computations
3             by Soenke J. Peters
4             */
5              
6             #include "EXTERN.h"
7             #include "perl.h"
8             #include "XSUB.h"
9              
10             /*
11             Based on CRC-32 version 1.04 by Craig Bruce, 05-Dec-1994
12             */
13              
14             #include
15             #include
16             #include
17              
18             #ifdef GENTABLE
19             U32
20             crcTable[256];
21              
22             void
23             crcgen( void )
24             {
25             U32 crc, poly;
26             int i, j;
27              
28             poly = 0xEDB88320L;
29             for (i=0; i<256; i++) {
30             crc = i;
31             for (j=8; j>0; j--) {
32             if (crc&1) {
33             crc = (crc >> 1) ^ poly;
34             } else {
35             crc >>= 1;
36             }
37             }
38             crcTable[i] = crc;
39             }
40             }
41             #else /* GENTABLE */
42             U32
43             crcTable[256] = {
44             0x0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
45             0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
46             0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
47             0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
48             0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
49             0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
50             0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
51             0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
52             0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433,
53             0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01,
54             0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
55             0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
56             0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
57             0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
58             0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
59             0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
60             0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683,
61             0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1,
62             0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
63             0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
64             0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
65             0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
66             0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
67             0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
68             0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713,
69             0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21,
70             0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
71             0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
72             0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
73             0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
74             0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
75             0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
76             };
77             #endif /* GENTABLE */
78              
79             U32
80 50           getcrc(char *c, int len, U32 crcinit)
81             {
82             register U32 crc;
83 50           char *e = c + len;
84              
85 50           crc = crcinit^0xFFFFFFFF;
86 652 100         while (c < e) {
87 602           crc = ((crc >> 8) & 0x00FFFFFF) ^ crcTable[ (crc^ *c) & 0xFF ];
88 602           ++c;
89             }
90 50           return( crc^0xFFFFFFFF );
91             }
92              
93             #define BUFSIZE 32768
94              
95             U32
96 1           getcrc_fp( PerlIO *fp, U32 crcinit )
97             {
98             register U32 crc;
99             register U16 len;
100             unsigned char buf[BUFSIZE];
101              
102 1           crc = crcinit^0xFFFFFFFF;
103 2 100         while((len = PerlIO_read(fp, buf, BUFSIZE)) > 0 ) {
104 1           unsigned char * p = buf;
105             do {
106 73           crc = ((crc >> 8) & 0x00FFFFFF) ^ crcTable[(unsigned char)( (crc & 0xff) ^ *(p++) )];
107 73 100         } while (--len);
108             }
109 1           return( crc^0xFFFFFFFF );
110             }
111              
112             svtype
113 51           getsvtype(SV *sv)
114             {
115 51 50         if (sv == NULL )
116 0           return SVt_NULL;
117 51 50         if (SvROK(sv))
118 0           return SvTYPE(SvRV(sv));
119             else
120 51           return SvTYPE(sv);
121             }
122              
123             MODULE = String::CRC32 PACKAGE = String::CRC32
124              
125             VERSIONCHECK: DISABLE
126             PROTOTYPES: DISABLE
127              
128             U32
129             crc32(data, ...)
130             char *data = NO_INIT
131             PREINIT:
132 51           U32 crcinit = 0;
133             STRLEN data_len;
134             PPCODE:
135             int sv_type;
136             IO *io;
137             SV *sv;
138 51           U32 rv = 0;
139             {
140             #ifdef GENTABLE
141             crcgen();
142             #endif /* GENTABLE */
143             /* Horst Fickenscher mailed me that it
144             could be useful to supply an initial value other than 0, e.g.
145             to calculate checksums of big files without the need of keeping
146             them comletely in memory */
147 51 100         if ( items > 1 )
148 24 50         crcinit = (U32) SvNV(ST(items - 1));
149              
150 51           sv_type = getsvtype(ST(0));
151              
152 51 100         if (sv_type == SVt_PVGV)
153             {
154 1           io = sv_2io(ST(0));
155 1           rv = getcrc_fp(IoIFP(io), crcinit);
156             }
157             else
158             {
159 50 100         data = (char *)SvPV(ST(0),data_len);
160 50           rv = getcrc(data, data_len, crcinit);
161             }
162 51 50         EXTEND(sp, 1);
163 51           sv = newSV(0);
164 51           sv_setuv(sv, (UV)rv);
165 51           PUSHs(sv_2mortal(sv));
166             }