rfc822-parser.c revision 0452398b245ac9643f6b47dfc450dc5bf7da51d0
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger/* Copyright (c) 2005-2008 Dovecot authors, see the included COPYING file */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger atext = ALPHA / DIGIT / ; Any character except controls,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger "!" / "#" / ; SP, and specials.
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa "$" / "%" / ; Used for atoms
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger tspecials := "(" / ")" / "<" / ">" / "@" /
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger "," / ";" / ":" / "\" / <">
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger "/" / "[" / "]" / "?" / "="
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa So token is same as dot-atom, except stops also at '/', '?' and '='.
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa/* atext chars are marked with 1, alpha and digits with 2,
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa atext-but-mime-tspecials with 4 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-15 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16-31 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 4, /* 32-47 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 4, 0, 4, /* 48-63 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 64-79 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, /* 80-95 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 96-111 */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, /* 112-127 */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksavoid rfc822_parser_init(struct rfc822_parser_context *ctx,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerint rfc822_skip_comment(struct rfc822_parser_context *ctx)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger const unsigned char *start;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger for (; ctx->data != ctx->end; ctx->data++) {
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa /* missing ')' */
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksaint rfc822_skip_lwsp(struct rfc822_parser_context *ctx)
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksaint rfc822_parse_atom(struct rfc822_parser_context *ctx, string_t *str)
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa const unsigned char *start;
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa atom = [CFWS] 1*atext [CFWS]
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa ; Any character except controls, SP, and specials.
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa if (ctx->data == ctx->end || !IS_ATEXT(*ctx->data))
b2ee879528ace361f0f5a55de48c6b90515b27b0Eugen Kuksa for (start = ctx->data++; ctx->data != ctx->end; ctx->data++) {
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksaint rfc822_parse_dot_atom(struct rfc822_parser_context *ctx, string_t *str)
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa const unsigned char *start;
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa dot-atom = [CFWS] dot-atom-text [CFWS]
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa dot-atom-text = 1*atext *("." 1*atext)
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa ; Any character except controls, SP, and specials.
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa For RFC-822 compatibility allow LWSP around '.'
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa if (ctx->data == ctx->end || !IS_ATEXT(*ctx->data))
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa for (start = ctx->data++; ctx->data != ctx->end; ctx->data++) {
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksaint rfc822_parse_mime_token(struct rfc822_parser_context *ctx, string_t *str)
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa const unsigned char *start;
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa for (start = ctx->data; ctx->data != ctx->end; ctx->data++) {
5ddd457a4e278410e58386a2333f5853f2f2ea8fEugen Kuksa if (IS_ATEXT_NON_TSPECIAL(*ctx->data) || *ctx->data == '.')
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str_append_n(str, start, ctx->data - start);
23305f217b86a2ebf90a848af9036908e0070542Eugen Kuksaint rfc822_parse_quoted_string(struct rfc822_parser_context *ctx, string_t *str)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger const unsigned char *start;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger for (start = ctx->data; ctx->data != ctx->end; ctx->data++) {
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str_append_n(str, start, ctx->data - start);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger /* folding whitespace, remove the (CR)LF */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str_append_n(str, start, ctx->data - start);
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase /* missing '"' */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerrfc822_parse_atom_or_dot(struct rfc822_parser_context *ctx, string_t *str)
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase const unsigned char *start;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger atom = [CFWS] 1*atext [CFWS]
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase ; Any character except controls, SP, and specials.
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger The difference between this function and rfc822_parse_dot_atom()
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger is that this doesn't just silently skip over all the whitespace.
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger for (start = ctx->data; ctx->data != ctx->end; ctx->data++) {
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if (IS_ATEXT(*ctx->data) || *ctx->data == '.')
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str_append_n(str, start, ctx->data - start);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str_append_n(str, start, ctx->data - start);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerint rfc822_parse_phrase(struct rfc822_parser_context *ctx, string_t *str)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger phrase = 1*word / obs-phrase
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger word = atom / quoted-string
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger obs-phrase = word *(word / "." / CFWS)
if (ret <= 0)
return ret;
const unsigned char *start;
int ret;