Mercurial > pidgin.yaz
comparison src/util.c @ 6872:dd0eecfbe413
[gaim-migrate @ 7418]
ok, these are some tweaks i've made to core code working on the new jabber
plugin.
- add gaim_find_buddy_in_group() that searches a specific group instead
of the entire list. kinda handy.
- re-did the base64 encoding function. i think it may have been broken,
i'm not sure, but this i know works.
- fix the formatted notify dialog to be more to my liking, and to have
a working Close button.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Wed, 17 Sep 2003 03:45:04 +0000 |
parents | 4ae5d9c3d9ec |
children | 083d1e4a9c78 |
comparison
equal
deleted
inserted
replaced
6871:714fc8f45cf2 | 6872:dd0eecfbe413 |
---|---|
317 | 317 |
318 static const char alphabet[] = | 318 static const char alphabet[] = |
319 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | 319 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
320 "0123456789+/"; | 320 "0123456789+/"; |
321 | 321 |
322 /* This was borrowed from the Kame source, and then tweaked to our needs */ | 322 char *tobase64(const unsigned char *in, size_t inlen) |
323 char *tobase64(const unsigned char *buf, size_t len) | 323 { |
324 { | 324 char *out, *rv; |
325 char *s = NULL, *rv = NULL; | 325 |
326 unsigned long tmp; | 326 rv = out = g_malloc((4 * (inlen + 1)) / 3 + 1); |
327 | 327 |
328 s = g_malloc((4 * (len + 1)) / 3 + 1); | 328 for (; inlen >= 3; inlen -= 3) |
329 | 329 { |
330 rv = s; | 330 *out++ = alphabet[in[0] >> 2]; |
331 while (len >= 3) { | 331 *out++ = alphabet[((in[0] << 4) & 0x30) | (in[1] >> 4)]; |
332 tmp = buf[0] << 16 | buf[1] << 8 | buf[2]; | 332 *out++ = alphabet[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; |
333 s[0] = alphabet[tmp >> 18]; | 333 *out++ = alphabet[in[2] & 0x3f]; |
334 s[1] = alphabet[(tmp >> 12) & 077]; | 334 in += 3; |
335 s[2] = alphabet[(tmp >> 6) & 077]; | 335 } |
336 s[3] = alphabet[tmp & 077]; | 336 if (inlen > 0) |
337 len -= 3; | 337 { |
338 buf += 3; | 338 unsigned char fragment; |
339 s += 4; | 339 |
340 } | 340 *out++ = alphabet[in[0] >> 2]; |
341 | 341 fragment = (in[0] << 4) & 0x30; |
342 /* RFC 1521 enumerates these three possibilities... */ | 342 if (inlen > 1) |
343 switch(len) { | 343 fragment |= in[1] >> 4; |
344 case 2: | 344 *out++ = alphabet[fragment]; |
345 tmp = buf[0] << 16 | buf[1] << 8; | 345 *out++ = (inlen < 2) ? '=' : alphabet[(in[1] << 2) & 0x3c]; |
346 s[0] = alphabet[(tmp >> 18) & 077]; | 346 *out++ = '='; |
347 s[1] = alphabet[(tmp >> 12) & 077]; | 347 } |
348 s[2] = alphabet[(tmp >> 6) & 077]; | 348 *out = '\0'; |
349 s[3] = '='; | |
350 s[4] = '\0'; | |
351 break; | |
352 case 1: | |
353 tmp = buf[0] << 16; | |
354 s[0] = alphabet[(tmp >> 18) & 077]; | |
355 s[1] = alphabet[(tmp >> 12) & 077]; | |
356 s[2] = s[3] = '='; | |
357 s[4] = '\0'; | |
358 break; | |
359 case 0: | |
360 s[0] = '\0'; | |
361 break; | |
362 } | |
363 | 349 |
364 return rv; | 350 return rv; |
365 } | 351 } |
366 | 352 |
367 | 353 |