comparison src/util.c @ 7824:1663c076a744

[gaim-migrate @ 8476] Changes from revo/shx. They're still all #if 0'ed out and what not. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Wed, 10 Dec 2003 06:34:11 +0000
parents 8e60ddc28a22
children 13334c29799b
comparison
equal deleted inserted replaced
7823:35cd3ef34fb0 7824:1663c076a744
354 g_free(orig); 354 g_free(orig);
355 355
356 return tmp; 356 return tmp;
357 357
358 #if 0 358 #if 0
359 /* This is revo/shx's version, and it caused coredumps for me */ 359 /* The shx version! */
360 char *cur, *mark; 360 const char *cur, *mark;
361 char *unencoded_start, *unencoded_end; 361 const char *unencoded, *encoded;
362 char *charset, *encoding, *word, *decoded;
363 char *n, *new; 362 char *n, *new;
364 363
365 n = new = g_malloc(strlen(str)); 364 n = new = g_malloc(strlen(str));
366 charset = word = NULL;
367 365
368 gaim_debug(GAIM_DEBUG_ERROR, "XXX", "new is %d\n", new); 366 gaim_debug(GAIM_DEBUG_ERROR, "XXX", "new is %d\n", new);
369 /* Here we will be looking for encoded words and if they seem to be 367
370 * valid then decode them */ 368 /*
371 369 * Here we will be looking for encoded words and if they seem to be
372 for (unencoded_start = cur = str; 370 * valid then decode them.
373 (unencoded_end = cur = strstr(cur, "=?")); 371 * They are of this form: =?charset?encoding?text?=
374 unencoded_start = cur) { 372 */
375 373 for ( unencoded = cur = str;
376 int len; 374 (encoded = cur = strstr(cur, "=?"));
377 char *token; 375 unencoded = cur) {
378 GQueue *tokens = g_queue_new(); 376
379 377 gboolean found_word = FALSE;
380 for (cur += 2, mark = cur; *cur; cur++) { 378 int i, num, len, dec_len;
379 char *decoded, *converted;
380 char *tokens[3];
381
382 /* Let's look for tokens, they are between ?'s */
383 for (cur += 2, mark = cur, num = 0; *cur; cur++) {
381 if (*cur == '?') { 384 if (*cur == '?') {
382 token = g_strndup(mark, cur - mark); 385 if (num > 2)
383 g_queue_push_head(tokens, token); 386 /* No more than 3 tokens. */
387 break;
388
389 tokens[num++] = g_strndup(mark, cur - mark);
384 390
385 mark = (cur + 1); 391 mark = (cur + 1);
386 392
387 if (mark[0] == '=' && mark[1] == '\0') 393 if (mark[0] == '=' && mark[1] == '\0') {
394 found_word = TRUE;
388 break; 395 break;
389 } else { 396 }
390 if ((tokens->length == 2) && (*cur == ' ')) 397 }
391 break; 398 #if 0
392 else if ((tokens->length < 2) && (strchr("()<>@,;:/[]", *cur))) 399 /* I think this is rarely going to happen, if at all */
393 break; 400 else if ((num < 2) && (strchr("()<>@,;:/[]", *cur)))
394 else if (tokens->length > 2) 401 /* There can't be these characters in the first two tokens. */
395 break; 402 break;
396 } 403 else if ((num == 2) && (*cur == ' '))
404 /* There can't be spaces in the third token. */
405 break;
406 #endif
397 } 407 }
398 408
399 cur += 2; 409 cur += 2;
400 gaim_debug(GAIM_DEBUG_ERROR, "XXX", "new is %d, this is probably different than above, that's bad\n", new); 410 gaim_debug(GAIM_DEBUG_ERROR, "XXX", "new is %d, this is probably different than above, that's bad\n", new);
401 411 if (found_word) {
402 if ((tokens->length == 3) && (*mark == '=')) { 412 /* We found an encoded word. */
403 len = unencoded_end - unencoded_start; 413 /* =?charset?encoding?text?= */
404 n = strncpy(n, unencoded_start, len) + len; 414 len = encoded - unencoded;
405 415 n = strncpy(n, unencoded, len) + len;
406 charset = g_queue_pop_tail(tokens); 416
407 encoding = g_queue_pop_tail(tokens); 417 if (g_ascii_strcasecmp(tokens[1], "Q") == 0)
408 word = g_queue_pop_tail(tokens); 418 gaim_quotedp_decode(tokens[2], &decoded, &dec_len);
409 419 else if (g_ascii_strcasecmp(tokens[1], "B") == 0)
410 if ((decoded = gaim_mime_decode_word(charset, encoding, word))) { 420 gaim_base64_decode(tokens[2], &decoded, &dec_len);
411 len = strlen(decoded); 421 else
412 n = strncpy(n, decoded, len) + len; 422 decoded = NULL;
423
424 if (decoded) {
425 converted = g_convert(decoded, dec_len, OUT_CHARSET, tokens[0],
426 NULL, &len, NULL);
413 g_free(decoded); 427 g_free(decoded);
414 } 428
415 429 n = strncpy(n, converted, len) + len;
416 g_free(charset); 430 g_free(converted);
417 g_free(encoding); 431 }
418 g_free(word);
419 } else { 432 } else {
420 len = cur - unencoded_start; 433 /* Some unencoded text. */
421 n = strncpy(n, unencoded_start, len) + len; 434 len = cur - unencoded;
422 435 n = strncpy(n, unencoded, len) + len;
423 while ((token = g_queue_pop_tail(tokens))) 436 }
424 g_free(token); 437
425 } 438 for (i = 0; i < num; i++)
426 439 g_free(tokens[i]);
427 g_queue_free(tokens);
428 } 440 }
429 441
430 *n = '\0'; 442 *n = '\0';
431 443
432 if (*unencoded_start) 444 /* There is unencoded text at the end. */
433 n = strcpy(n, unencoded_start); 445 if (*unencoded)
446 n = strcpy(n, unencoded);
434 447
435 return new; 448 return new;
436 #endif 449 #endif
437 } 450 }
438 451