Mercurial > dovecot > original-hg > dovecot-1.2
view src/lib-mail/message-content-parser.c @ 3404:ce3b55886a1e HEAD
Converted MIME Content-* header parser to use rfc822-parser API.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 05 Jun 2005 22:32:45 +0300 |
parents | 60646878858e |
children | f93a32d1c6b0 |
line wrap: on
line source
/* Copyright (C) 2002-2005 Timo Sirainen */ #include "lib.h" #include "str.h" #include "rfc822-parser.h" #include "message-content-parser.h" void message_content_parse_header(const unsigned char *data, size_t size, parse_content_callback_t *callback, parse_content_param_callback_t *param_cb, void *context) { struct rfc822_parser_context parser; string_t *str; size_t key_len; int quoted_string; rfc822_parser_init(&parser, data, size, NULL); t_push(); str = t_str_new(256); /* get content type */ if (rfc822_parse_mime_token(&parser, str) > 0) { if (*parser.data == '/') { parser.data++; str_append_c(str, '/'); (void)rfc822_parse_mime_token(&parser, str); } } if (callback != NULL) callback(str_data(str), str_len(str), context); if (parser.data == parser.end || *parser.data != ';' || param_cb == NULL) { /* no parameters / error / no param callback */ t_pop(); return; } parser.data++; (void)rfc822_skip_lwsp(&parser); str_truncate(str, 0); while (rfc822_parse_mime_token(&parser, str) > 0) { /* <token> "=" <token> | <quoted-string> */ if (str_len(str) == 0 || *parser.data != '=' || rfc822_skip_lwsp(&parser) <= 0) break; parser.data++; quoted_string = parser.data != parser.end && *parser.data == '"'; key_len = str_len(str); if (quoted_string) { if (rfc822_parse_quoted_string(&parser, str) < 0) break; } else { if (rfc822_parse_mime_token(&parser, str) < 0) break; } param_cb(str_data(str), key_len, str_data(str) + key_len, str_len(str) - key_len, quoted_string, context); str_truncate(str, 0); } t_pop(); }