34
34
#include " Common/XferDeepCRC.h"
35
35
#include " Common/crc.h"
36
36
#include " Common/Snapshot.h"
37
- #include " winsock2 .h" // for htonl
37
+ #include " utility/endian_compat .h"
38
38
39
39
// -------------------------------------------------------------------------------------------------
40
40
// -------------------------------------------------------------------------------------------------
@@ -97,22 +97,8 @@ void XferCRC::endBlock( void )
97
97
// -------------------------------------------------------------------------------------------------
98
98
void XferCRC::addCRC ( UnsignedInt val )
99
99
{
100
- int hibit;
101
100
102
- val = htonl (val);
103
-
104
- if (m_crc & 0x80000000 )
105
- {
106
- hibit = 1 ;
107
- }
108
- else
109
- {
110
- hibit = 0 ;
111
- }
112
-
113
- m_crc <<= 1 ;
114
- m_crc += val;
115
- m_crc += hibit;
101
+ m_crc = (m_crc << 1 ) + htobe (val) +((m_crc >> 31 ) & 0x01 );
116
102
117
103
} // end addCRC
118
104
@@ -140,30 +126,35 @@ void XferCRC::xferSnapshot( Snapshot *snapshot )
140
126
void XferCRC::xferImplementation ( void *data, Int dataSize )
141
127
{
142
128
143
- if (!data || dataSize < 1 )
144
- {
145
- return ;
146
- }
147
-
148
129
const UnsignedInt *uintPtr = (const UnsignedInt *) (data);
130
+ int validData = (data != NULL ) & (dataSize > 0 );
131
+ int dataBytes = (dataSize / 4 ) * validData;
149
132
150
- for (Int i=0 ; i<dataSize/4 ; i++)
133
+ Int i = 0 ;
134
+ for (i=0 ; i<dataBytes; i++)
151
135
{
152
136
addCRC (*uintPtr++);
153
137
}
154
138
155
139
int leftover = dataSize & 3 ;
156
- if (leftover)
140
+ validData = (data != NULL ) & (leftover > 0 );
141
+
142
+ UnsignedInt val = 0 ;
143
+ const unsigned char *c = (const unsigned char *)uintPtr;
144
+
145
+ switch (leftover * validData)
157
146
{
158
- UnsignedInt val = 0 ;
159
- const unsigned char *c = ( const unsigned char *)uintPtr ;
160
- for (Int i= 0 ; i<leftover; i++)
161
- {
162
- val += (c[i] << (i* 8 ));
163
- }
164
- val = htonl (val);
165
- addCRC (val) ;
147
+ case 3 :
148
+ val += (c[ 2 ] << ( 2 * 8 )) ;
149
+ case 2 :
150
+ val += (c[ 1 ] << ( 1 * 8 ));
151
+ case 1 :
152
+ val += (c[ 0 ] << ( 0 * 8 ));
153
+ default :
154
+ break ;
166
155
}
156
+
157
+ m_crc = (m_crc << (1 *validData)) + (val +((m_crc >> 31 ) & 0x01 )) * validData;
167
158
168
159
} // end xferImplementation
169
160
@@ -179,7 +170,7 @@ void XferCRC::skip( Int dataSize )
179
170
UnsignedInt XferCRC::getCRC ( void )
180
171
{
181
172
182
- return htonl (m_crc);
173
+ return htobe (m_crc);
183
174
184
175
} // end skip
185
176
0 commit comments