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
|
|
|
|
|
|
|
} |