aschiffler@6713
|
1 |
/*
|
aschiffler@6713
|
2 |
Simple DirectMedia Layer
|
slouken@9998
|
3 |
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
aschiffler@6713
|
4 |
|
aschiffler@6713
|
5 |
This software is provided 'as-is', without any express or implied
|
aschiffler@6713
|
6 |
warranty. In no event will the authors be held liable for any damages
|
aschiffler@6713
|
7 |
arising from the use of this software.
|
aschiffler@6713
|
8 |
|
aschiffler@6713
|
9 |
Permission is granted to anyone to use this software for any purpose,
|
aschiffler@6713
|
10 |
including commercial applications, and to alter it and redistribute it
|
aschiffler@6713
|
11 |
freely, subject to the following restrictions:
|
aschiffler@6713
|
12 |
|
aschiffler@6713
|
13 |
1. The origin of this software must not be misrepresented; you must not
|
aschiffler@6713
|
14 |
claim that you wrote the original software. If you use this software
|
aschiffler@6713
|
15 |
in a product, an acknowledgment in the product documentation would be
|
aschiffler@6713
|
16 |
appreciated but is not required.
|
aschiffler@6713
|
17 |
2. Altered source versions must be plainly marked as such, and must not be
|
aschiffler@6713
|
18 |
misrepresented as being the original software.
|
aschiffler@6713
|
19 |
3. This notice may not be removed or altered from any source distribution.
|
aschiffler@6713
|
20 |
*/
|
aschiffler@6713
|
21 |
|
aschiffler@6713
|
22 |
/*
|
aschiffler@6713
|
23 |
|
slouken@7191
|
24 |
Used by the test execution component.
|
aschiffler@6713
|
25 |
Original source code contributed by A. Schiffler for GSOC project.
|
aschiffler@6713
|
26 |
|
aschiffler@6713
|
27 |
*/
|
aschiffler@6713
|
28 |
|
aschiffler@6713
|
29 |
#include "SDL_config.h"
|
aschiffler@6713
|
30 |
|
aschiffler@6713
|
31 |
#include "SDL_test.h"
|
aschiffler@6713
|
32 |
|
aschiffler@6713
|
33 |
|
aschiffler@6713
|
34 |
int SDLTest_Crc32Init(SDLTest_Crc32Context *crcContext)
|
aschiffler@6713
|
35 |
{
|
aschiffler@6713
|
36 |
int i,j;
|
aschiffler@6713
|
37 |
CrcUint32 c;
|
aschiffler@6713
|
38 |
|
aschiffler@6713
|
39 |
/* Sanity check context pointer */
|
aschiffler@6713
|
40 |
if (crcContext==NULL) {
|
aschiffler@6713
|
41 |
return -1;
|
slouken@7191
|
42 |
}
|
slouken@7191
|
43 |
|
aschiffler@6713
|
44 |
/*
|
slouken@7191
|
45 |
* Build auxiliary table for parallel byte-at-a-time CRC-32
|
aschiffler@6713
|
46 |
*/
|
aschiffler@6713
|
47 |
#ifdef ORIGINAL_METHOD
|
aschiffler@6713
|
48 |
for (i = 0; i < 256; ++i) {
|
aschiffler@6713
|
49 |
for (c = i << 24, j = 8; j > 0; --j) {
|
aschiffler@6713
|
50 |
c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
|
aschiffler@6713
|
51 |
}
|
aschiffler@6713
|
52 |
crcContext->crc32_table[i] = c;
|
aschiffler@6713
|
53 |
}
|
aschiffler@6713
|
54 |
#else
|
aschiffler@6713
|
55 |
for (i=0; i<256; i++) {
|
aschiffler@6713
|
56 |
c = i;
|
aschiffler@6713
|
57 |
for (j=8; j>0; j--) {
|
aschiffler@6713
|
58 |
if (c & 1) {
|
aschiffler@6713
|
59 |
c = (c >> 1) ^ CRC32_POLY;
|
aschiffler@6713
|
60 |
} else {
|
aschiffler@6713
|
61 |
c >>= 1;
|
aschiffler@6713
|
62 |
}
|
aschiffler@6713
|
63 |
}
|
aschiffler@6713
|
64 |
crcContext->crc32_table[i] = c;
|
aschiffler@6713
|
65 |
}
|
aschiffler@6713
|
66 |
#endif
|
slouken@7191
|
67 |
|
aschiffler@6713
|
68 |
return 0;
|
aschiffler@6713
|
69 |
}
|
aschiffler@6713
|
70 |
|
aschiffler@6713
|
71 |
/* Complete CRC32 calculation on a memory block */
|
slouken@10609
|
72 |
/* un-used
|
aschiffler@6713
|
73 |
int SDLTest_Crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)
|
aschiffler@6713
|
74 |
{
|
aschiffler@6713
|
75 |
if (SDLTest_Crc32CalcStart(crcContext,crc32)) {
|
aschiffler@6713
|
76 |
return -1;
|
aschiffler@6713
|
77 |
}
|
slouken@7191
|
78 |
|
aschiffler@6713
|
79 |
if (SDLTest_Crc32CalcBuffer(crcContext, inBuf, inLen, crc32)) {
|
aschiffler@6713
|
80 |
return -1;
|
aschiffler@6713
|
81 |
}
|
slouken@7191
|
82 |
|
aschiffler@6713
|
83 |
if (SDLTest_Crc32CalcEnd(crcContext, crc32)) {
|
aschiffler@6713
|
84 |
return -1;
|
aschiffler@6713
|
85 |
}
|
slouken@7191
|
86 |
|
aschiffler@6713
|
87 |
return 0;
|
aschiffler@6713
|
88 |
}
|
slouken@10609
|
89 |
*/
|
aschiffler@6713
|
90 |
|
aschiffler@6713
|
91 |
/* Start crc calculation */
|
aschiffler@6713
|
92 |
|
aschiffler@6713
|
93 |
int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
|
aschiffler@6713
|
94 |
{
|
aschiffler@6713
|
95 |
/* Sanity check pointers */
|
aschiffler@6713
|
96 |
if (crcContext==NULL) {
|
aschiffler@6713
|
97 |
*crc32=0;
|
aschiffler@6713
|
98 |
return -1;
|
slouken@7191
|
99 |
}
|
aschiffler@6713
|
100 |
|
aschiffler@6713
|
101 |
/*
|
slouken@7191
|
102 |
* Preload shift register, per CRC-32 spec
|
aschiffler@6713
|
103 |
*/
|
aschiffler@6713
|
104 |
*crc32 = 0xffffffff;
|
aschiffler@6713
|
105 |
|
aschiffler@6713
|
106 |
return 0;
|
aschiffler@6713
|
107 |
}
|
aschiffler@6713
|
108 |
|
aschiffler@6713
|
109 |
/* Finish crc calculation */
|
aschiffler@6713
|
110 |
|
aschiffler@6713
|
111 |
int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)
|
aschiffler@6713
|
112 |
{
|
aschiffler@6713
|
113 |
/* Sanity check pointers */
|
aschiffler@6713
|
114 |
if (crcContext==NULL) {
|
aschiffler@6713
|
115 |
*crc32=0;
|
aschiffler@6713
|
116 |
return -1;
|
slouken@7191
|
117 |
}
|
slouken@7191
|
118 |
|
aschiffler@6713
|
119 |
/*
|
slouken@7191
|
120 |
* Return complement, per CRC-32 spec
|
aschiffler@6713
|
121 |
*/
|
aschiffler@6713
|
122 |
*crc32 = (~(*crc32));
|
aschiffler@6713
|
123 |
|
aschiffler@6713
|
124 |
return 0;
|
aschiffler@6713
|
125 |
}
|
aschiffler@6713
|
126 |
|
aschiffler@6713
|
127 |
/* Include memory block in crc */
|
aschiffler@6713
|
128 |
|
aschiffler@6713
|
129 |
int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)
|
aschiffler@6713
|
130 |
{
|
aschiffler@6713
|
131 |
CrcUint8 *p;
|
aschiffler@6713
|
132 |
register CrcUint32 crc;
|
aschiffler@6713
|
133 |
|
aschiffler@6713
|
134 |
if (crcContext==NULL) {
|
aschiffler@6713
|
135 |
*crc32=0;
|
aschiffler@6713
|
136 |
return -1;
|
aschiffler@6713
|
137 |
}
|
slouken@7191
|
138 |
|
aschiffler@6713
|
139 |
if (inBuf==NULL) {
|
aschiffler@6713
|
140 |
return -1;
|
aschiffler@6713
|
141 |
}
|
aschiffler@6713
|
142 |
|
aschiffler@6713
|
143 |
/*
|
slouken@7191
|
144 |
* Calculate CRC from data
|
aschiffler@6713
|
145 |
*/
|
aschiffler@6713
|
146 |
crc = *crc32;
|
aschiffler@6713
|
147 |
for (p = inBuf; inLen > 0; ++p, --inLen) {
|
slouken@7191
|
148 |
#ifdef ORIGINAL_METHOD
|
aschiffler@6713
|
149 |
crc = (crc << 8) ^ crcContext->crc32_table[(crc >> 24) ^ *p];
|
aschiffler@6713
|
150 |
#else
|
aschiffler@6713
|
151 |
crc = ((crc >> 8) & 0x00FFFFFF) ^ crcContext->crc32_table[ (crc ^ *p) & 0xFF ];
|
slouken@7191
|
152 |
#endif
|
slouken@7191
|
153 |
}
|
aschiffler@6713
|
154 |
*crc32 = crc;
|
slouken@7191
|
155 |
|
aschiffler@6713
|
156 |
return 0;
|
aschiffler@6713
|
157 |
}
|
aschiffler@6713
|
158 |
|
aschiffler@6713
|
159 |
int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext)
|
aschiffler@6713
|
160 |
{
|
aschiffler@6713
|
161 |
if (crcContext==NULL) {
|
aschiffler@6713
|
162 |
return -1;
|
slouken@7191
|
163 |
}
|
aschiffler@6713
|
164 |
|
aschiffler@6713
|
165 |
return 0;
|
aschiffler@6713
|
166 |
}
|