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 *