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