Mercurial > pidgin
comparison src/util.c @ 5426:8d8bf0d31a23
[gaim-migrate @ 5805]
i'm cleaning out my tree
1. new tobase64 function that works better
2. new date/time stamp parsing stuff for jabber
3. other misc stuff, not deserving of specific mention
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 18 May 2003 05:45:18 +0000 |
parents | ccec8893c1be |
children | a2f26666de42 |
comparison
equal
deleted
inserted
replaced
5425:73bde657e212 | 5426:8d8bf0d31a23 |
---|---|
348 | 348 |
349 static const char alphabet[] = | 349 static const char alphabet[] = |
350 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | 350 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
351 "0123456789+/"; | 351 "0123456789+/"; |
352 | 352 |
353 /* XXX Find bug */ | 353 /* This was borrowed from the Kame source, and then tweaked to our needs */ |
354 char *tobase64(const char *text) | 354 char *tobase64(const unsigned char *buf, size_t len) |
355 { | 355 { |
356 char *out = NULL; | 356 char *s, *rv; |
357 const char *c; | 357 unsigned tmp; |
358 unsigned int tmp = 0; | 358 |
359 int len = 0, n = 0; | 359 if(len < 0) |
360 | 360 len = strlen(buf); |
361 c = text; | 361 |
362 | 362 s = g_malloc((4 * (len + 1)) / 3 + 1); |
363 while (*c) { | 363 |
364 tmp = tmp << 8; | 364 rv = s; |
365 tmp += *c; | 365 while (len >= 3) { |
366 n++; | 366 tmp = buf[0] << 16 | buf[1] << 8 | buf[2]; |
367 | 367 s[0] = alphabet[tmp >> 18]; |
368 if (n == 3) { | 368 s[1] = alphabet[(tmp >> 12) & 077]; |
369 out = g_realloc(out, len + 4); | 369 s[2] = alphabet[(tmp >> 6) & 077]; |
370 out[len] = alphabet[(tmp >> 18) & 0x3f]; | 370 s[3] = alphabet[tmp & 077]; |
371 out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; | 371 len -= 3; |
372 out[len + 2] = alphabet[(tmp >> 6) & 0x3f]; | 372 buf += 3; |
373 out[len + 3] = alphabet[tmp & 0x3f]; | 373 s += 4; |
374 len += 4; | 374 } |
375 tmp = 0; | 375 |
376 n = 0; | 376 /* RFC 1521 enumerates these three possibilities... */ |
377 } | 377 switch(len) { |
378 c++; | 378 case 2: |
379 } | 379 tmp = buf[0] << 16 | buf[1] << 8; |
380 switch (n) { | 380 s[0] = alphabet[(tmp >> 18) & 077]; |
381 | 381 s[1] = alphabet[(tmp >> 12) & 077]; |
382 case 2: | 382 s[2] = alphabet[(tmp >> 6) & 077]; |
383 tmp <<= 8; | 383 s[3] = '='; |
384 out = g_realloc(out, len + 5); | 384 s[4] = '\0'; |
385 out[len] = alphabet[(tmp >> 18) & 0x3f]; | 385 break; |
386 out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; | 386 case 1: |
387 out[len + 2] = alphabet[(tmp >> 6) & 0x3f]; | 387 tmp = buf[0] << 16; |
388 out[len + 3] = '='; | 388 s[0] = alphabet[(tmp >> 18) & 077]; |
389 out[len + 4] = 0; | 389 s[1] = alphabet[(tmp >> 12) & 077]; |
390 break; | 390 s[2] = s[3] = '='; |
391 case 1: | 391 s[4] = '\0'; |
392 tmp <<= 16; | 392 break; |
393 out = g_realloc(out, len + 5); | 393 case 0: |
394 out[len] = alphabet[(tmp >> 18) & 0x3f]; | 394 s[0] = '\0'; |
395 out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; | 395 break; |
396 out[len + 2] = '='; | 396 } |
397 out[len + 3] = '='; | 397 |
398 out[len + 4] = 0; | 398 return rv; |
399 break; | |
400 case 0: | |
401 out = g_realloc(out, len + 1); | |
402 out[len] = 0; | |
403 break; | |
404 } | |
405 return out; | |
406 } | 399 } |
407 | 400 |
408 | 401 |
409 void frombase64(const char *text, char **data, int *size) | 402 void frombase64(const char *text, char **data, int *size) |
410 { | 403 { |