Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3403:e64f8694b3f3 HEAD
Added rfc822_parse_mime_token() to rfc822-parser API.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 05 Jun 2005 22:32:33 +0300 |
parents | 513abd166949 |
children | ce3b55886a1e |
files | src/lib-mail/rfc822-parser.c src/lib-mail/rfc822-parser.h |
diffstat | 2 files changed, 43 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-mail/rfc822-parser.c Sun May 29 13:50:43 2005 +0300 +++ b/src/lib-mail/rfc822-parser.c Sun Jun 05 22:32:33 2005 +0300 @@ -16,14 +16,25 @@ "`" / "{" / "|" / "}" / "~" + + MIME: + + token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, + or tspecials> + tspecials := "(" / ")" / "<" / ">" / "@" / + "," / ";" / ":" / "\" / <"> + "/" / "[" / "]" / "?" / "=" + + So token is same as dot-atom, except stops also at '/', '?' and '='. */ -/* atext chars are marked with 1, alpha and digits with 2 */ +/* atext chars are marked with 1, alpha and digits with 2, + atext-but-mime-tspecials with 4 */ static unsigned char atext_chars[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-15 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16-31 */ - 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, /* 32-47 */ - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 1, /* 48-63 */ + 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 4, /* 32-47 */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 4, 0, 4, /* 48-63 */ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 64-79 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, /* 80-95 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 96-111 */ @@ -40,6 +51,8 @@ }; #define IS_ATEXT(c) \ (atext_chars[(int)(unsigned char)(c)] != 0) +#define IS_ATEXT_NON_TSPECIAL(c) \ + ((atext_chars[(int)(unsigned char)(c)] & 3) != 0) void rfc822_parser_init(struct rfc822_parser_context *ctx, const unsigned char *data, size_t size, @@ -108,7 +121,7 @@ break; if (rfc822_skip_comment(ctx) < 0) - break; + return -1; } return ctx->data != ctx->end; } @@ -172,6 +185,22 @@ return 0; } +int rfc822_parse_mime_token(struct rfc822_parser_context *ctx, string_t *str) +{ + const unsigned char *start; + + for (start = ctx->data; ctx->data != ctx->end; ctx->data++) { + if (IS_ATEXT_NON_TSPECIAL(*ctx->data) || *ctx->data == '.') + continue; + + str_append_n(str, start, ctx->data - start); + return rfc822_skip_lwsp(ctx); + } + + str_append_n(str, start, ctx->data - start); + return 0; +} + int rfc822_parse_quoted_string(struct rfc822_parser_context *ctx, string_t *str) { const unsigned char *start;
--- a/src/lib-mail/rfc822-parser.h Sun May 29 13:50:43 2005 +0300 +++ b/src/lib-mail/rfc822-parser.h Sun Jun 05 22:32:33 2005 +0300 @@ -10,13 +10,23 @@ const unsigned char *data, size_t size, string_t *last_comment); +/* Parse comment. Assumes parser's data points to '(' */ int rfc822_skip_comment(struct rfc822_parser_context *ctx); +/* Skip LWSP if there is any */ int rfc822_skip_lwsp(struct rfc822_parser_context *ctx); +/* Stop at next non-atext char */ int rfc822_parse_atom(struct rfc822_parser_context *ctx, string_t *str); +/* Like parse_atom() but don't stop at '.' */ int rfc822_parse_dot_atom(struct rfc822_parser_context *ctx, string_t *str); +/* Like parse_dot_atom() but stops for '/', '?' and '='. + Also it doesn't allow LWSP around '.' chars. */ +int rfc822_parse_mime_token(struct rfc822_parser_context *ctx, string_t *str); +/* "quoted string" */ int rfc822_parse_quoted_string(struct rfc822_parser_context *ctx, string_t *str); +/* atom or quoted-string */ int rfc822_parse_phrase(struct rfc822_parser_context *ctx, string_t *str); +/* dot-atom / domain-literal */ int rfc822_parse_domain(struct rfc822_parser_context *ctx, string_t *str); #endif