OLD | NEW |
---|---|
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */ | 1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */ |
2 /* vi: set expandtab shiftwidth=4 tabstop=4: */ | 2 /* vi: set expandtab shiftwidth=4 tabstop=4: */ |
3 /** | 3 /** |
4 * \file | 4 * \file |
5 * <PRE> | 5 * <PRE> |
6 * MODP_B64 - High performance base64 encoder/decoder | 6 * MODP_B64 - High performance base64 encoder/decoder |
7 * Version 1.3 -- 17-Mar-2006 | 7 * Version 1.3 -- 17-Mar-2006 |
8 * http://modp.com/release/base64 | 8 * http://modp.com/release/base64 |
9 * | 9 * |
10 * Copyright © 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com | 10 * Copyright © 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 } | 204 } |
205 } | 205 } |
206 #endif | 206 #endif |
207 | 207 |
208 size_t i; | 208 size_t i; |
209 int leftover = len % 4; | 209 int leftover = len % 4; |
210 size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4; | 210 size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4; |
211 | 211 |
212 uint8_t* p = (uint8_t*)dest; | 212 uint8_t* p = (uint8_t*)dest; |
213 uint32_t x = 0; | 213 uint32_t x = 0; |
214 uint32_t* destInt = (uint32_t*) p; | 214 const uint8_t* y = (uint8_t*)src; |
215 uint32_t* srcInt = (uint32_t*) src; | 215 src += 4; |
Alex Vakulenko (Google)
2015/09/17 21:15:17
Why do we even care about src from this point on?
Vitaly Buka (NO REVIEWS)
2015/09/17 21:19:42
Done.
| |
216 uint32_t y = *srcInt++; | |
217 for (i = 0; i < chunks; ++i) { | 216 for (i = 0; i < chunks; ++i) { |
218 x = d0[y & 0xff] | | 217 x = d0[y[0]] | d1[y[1]] | d2[y[2]] | d3[y[3]]; |
219 d1[(y >> 8) & 0xff] | | |
220 d2[(y >> 16) & 0xff] | | |
221 d3[(y >> 24) & 0xff]; | |
222 | 218 |
223 if (x >= BADCHAR) return MODP_B64_ERROR; | 219 if (x >= BADCHAR) return MODP_B64_ERROR; |
224 *destInt = x ; | 220 *p++ = ((uint8_t*)(&x))[0]; |
225 p += 3; | 221 *p++ = ((uint8_t*)(&x))[1]; |
226 destInt = (uint32_t*)p; | 222 *p++ = ((uint8_t*)(&x))[2]; |
227 y = *srcInt++;} | 223 y = (uint8_t*)src; |
224 src += 4;} | |
228 | 225 |
229 | 226 |
230 switch (leftover) { | 227 switch (leftover) { |
231 case 0: | 228 case 0: |
232 x = d0[y & 0xff] | | 229 x = d0[y[0]] | d1[y[1]] | d2[y[2]] | d3[y[3]]; |
233 d1[(y >> 8) & 0xff] | | |
234 d2[(y >> 16) & 0xff] | | |
235 d3[(y >> 24) & 0xff]; | |
236 | 230 |
237 if (x >= BADCHAR) return MODP_B64_ERROR; | 231 if (x >= BADCHAR) return MODP_B64_ERROR; |
238 *p++ = ((uint8_t*)(&x))[0]; | 232 *p++ = ((uint8_t*)(&x))[0]; |
239 *p++ = ((uint8_t*)(&x))[1]; | 233 *p++ = ((uint8_t*)(&x))[1]; |
240 *p = ((uint8_t*)(&x))[2]; | 234 *p = ((uint8_t*)(&x))[2]; |
241 return (chunks+1)*3; | 235 return (chunks+1)*3; |
242 break; | 236 break; |
243 case 1: /* with padding this is an impossible case */ | 237 case 1: /* with padding this is an impossible case */ |
244 x = d0[y & 0xff]; | 238 x = d0[y[0]]; |
245 *p = *((uint8_t*)(&x)); // i.e. first char/byte in int | 239 *p = *((uint8_t*)(&x)); // i.e. first char/byte in int |
246 break; | 240 break; |
247 case 2: // * case 2, 1 output byte */ | 241 case 2: // * case 2, 1 output byte */ |
248 x = d0[y & 0xff] | d1[y >> 8 & 0xff]; | 242 x = d0[y[0]] | d1[y[1]]; |
249 *p = *((uint8_t*)(&x)); // i.e. first char | 243 *p = *((uint8_t*)(&x)); // i.e. first char |
250 break; | 244 break; |
251 default: /* case 3, 2 output bytes */ | 245 default: /* case 3, 2 output bytes */ |
252 x = d0[y & 0xff] | | 246 x = d0[y[0]] | d1[y[1]] | d2[y[2]]; /* 0x3c */ |
253 d1[y >> 8 & 0xff ] | | |
254 d2[y >> 16 & 0xff]; /* 0x3c */ | |
255 *p++ = ((uint8_t*)(&x))[0]; | 247 *p++ = ((uint8_t*)(&x))[0]; |
256 *p = ((uint8_t*)(&x))[1]; | 248 *p = ((uint8_t*)(&x))[1]; |
257 break; | 249 break; |
258 } | 250 } |
259 | 251 |
260 if (x >= BADCHAR) return MODP_B64_ERROR; | 252 if (x >= BADCHAR) return MODP_B64_ERROR; |
261 | 253 |
262 return 3*chunks + (6*leftover)/8; | 254 return 3*chunks + (6*leftover)/8; |
263 } | 255 } |
264 | 256 |
265 #endif /* if bigendian / else / endif */ | 257 #endif /* if bigendian / else / endif */ |
OLD | NEW |