Mercurial > pidgin
comparison src/util.c @ 7673:42e5d2f4e4b1
[gaim-migrate @ 8317]
I'm gonna revert this to make it easier to applie the changed
patch which includes the stuff I'm reverting.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 30 Nov 2003 18:15:22 +0000 |
| parents | 30593bf56e71 |
| children | 66d9440db6ec |
comparison
equal
deleted
inserted
replaced
| 7672:73c7b22cf9bb | 7673:42e5d2f4e4b1 |
|---|---|
| 242 | 242 |
| 243 if (size) | 243 if (size) |
| 244 *size = len; | 244 *size = len; |
| 245 } | 245 } |
| 246 | 246 |
| 247 /************************************************************************** | |
| 248 * Quoted Printable Functions | |
| 249 **************************************************************************/ | |
| 250 void | |
| 251 gaim_quotedp_decode(const char *text, char **data, int *size) | |
| 252 { | |
| 253 char *p, *n, *new; | |
| 254 | |
| 255 n = new = malloc(strlen (text)); | |
| 256 | |
| 257 for (p = (char *)text; *p; p++, n++) { | |
| 258 if (*p == '=') { | |
| 259 sscanf(p + 1, "%2x\n", (int *)n); | |
| 260 p += 2; | |
| 261 } | |
| 262 else if (*p == '_') | |
| 263 *n = ' '; | |
| 264 else | |
| 265 *n = *p; | |
| 266 } | |
| 267 | |
| 268 *n = '\0'; | |
| 269 | |
| 270 if (size) | |
| 271 *size = n - new; | |
| 272 | |
| 273 /* Resize to take less space */ | |
| 274 /* new = realloc(new, n - new); */ | |
| 275 | |
| 276 *data = new; | |
| 277 } | |
| 278 | |
| 279 /************************************************************************** | |
| 280 * MIME Functions | |
| 281 **************************************************************************/ | |
| 282 #define OUT_CHARSET "utf-8" | |
| 283 | |
| 284 char * | |
| 285 gaim_mime_decode_word(const char *charset, const char *encoding, const char *text) | |
| 286 { | |
| 287 /* TODO: We need to check for nulls */ | |
| 288 char *decoded, *converted; | |
| 289 int len = 0; | |
| 290 | |
| 291 if (g_ascii_strcasecmp(encoding, "Q") == 0) | |
| 292 gaim_quotedp_decode(text, &decoded, &len); | |
| 293 else if (g_ascii_strcasecmp(encoding, "B") == 0) | |
| 294 gaim_base64_decode(text, &decoded, &len); | |
| 295 else | |
| 296 return NULL; | |
| 297 | |
| 298 | |
| 299 converted = g_convert(decoded, len, OUT_CHARSET, charset, NULL, NULL, NULL); | |
| 300 g_free(decoded); | |
| 301 | |
| 302 return converted; | |
| 303 } | |
| 304 | |
| 305 char * | |
| 306 gaim_mime_decode_field(const char *str) | |
| 307 { | |
| 308 char *cur, *mark; | |
| 309 char *unencoded_start, *unencoded_end; | |
| 310 char *charset, *encoding, *text, *decoded; | |
| 311 char *new, *n; | |
| 312 | |
| 313 n = new = malloc(strlen(str)); | |
| 314 charset = text = NULL; | |
| 315 | |
| 316 /* Here we will be looking for encoded words and if they seem to be | |
| 317 * valid then decode them */ | |
| 318 | |
| 319 for ( unencoded_start = cur = (char *)str; | |
| 320 (unencoded_end = cur = strstr(cur, "=?")); | |
| 321 unencoded_start = cur) | |
| 322 { | |
| 323 int len; | |
| 324 char *token; | |
| 325 GQueue *tokens = g_queue_new(); | |
| 326 | |
| 327 for (cur += 2, mark = cur; *cur; cur++) { | |
| 328 if (*cur == '?') { | |
| 329 token = g_strndup(mark, cur - mark); | |
| 330 g_queue_push_head(tokens, token); | |
| 331 | |
| 332 mark = (cur + 1); | |
| 333 | |
| 334 if (*mark == '=') | |
| 335 break; | |
| 336 } else { | |
| 337 if ((tokens->length == 2) && (*cur == ' ')) | |
| 338 break; | |
| 339 else if ((tokens->length < 2) && (strchr("()<>@,;:/[]", *cur))) | |
| 340 break; | |
| 341 else if (tokens->length > 2) | |
| 342 break; | |
| 343 } | |
| 344 } | |
| 345 | |
| 346 cur += 2; | |
| 347 | |
| 348 if ((tokens->length == 3) && (*mark == '=')) { | |
| 349 len = unencoded_end - unencoded_start; | |
| 350 n = strncpy(n, unencoded_start, len) + len; | |
| 351 | |
| 352 charset = g_queue_pop_tail(tokens); | |
| 353 encoding = g_queue_pop_tail(tokens); | |
| 354 text = g_queue_pop_tail(tokens); | |
| 355 | |
| 356 if ((decoded = gaim_mime_decode_word(charset, encoding, text))) { | |
| 357 len = strlen(decoded); | |
| 358 n = strncpy(n, decoded, len) + len; | |
| 359 g_free(decoded); | |
| 360 } | |
| 361 | |
| 362 g_free(charset); | |
| 363 g_free(encoding); | |
| 364 g_free(text); | |
| 365 } else { | |
| 366 len = cur - unencoded_start; | |
| 367 n = strncpy(n, unencoded_start, len) + len; | |
| 368 | |
| 369 while ((token = g_queue_pop_tail(tokens))) | |
| 370 g_free(token); | |
| 371 } | |
| 372 | |
| 373 g_queue_free(tokens); | |
| 374 } | |
| 375 | |
| 376 *n = '\0'; | |
| 377 | |
| 378 if (*unencoded_start) | |
| 379 n = strcpy(n, unencoded_start); | |
| 380 | |
| 381 return new; | |
| 382 } | |
| 383 | 247 |
| 384 /************************************************************************** | 248 /************************************************************************** |
| 385 * Date/Time Functions | 249 * Date/Time Functions |
| 386 **************************************************************************/ | 250 **************************************************************************/ |
| 387 const char * | 251 const char * |
