[dovecot-cvs] dovecot/src/lib-mail message-date.c,1.10,1.11
cras at dovecot.org
cras at dovecot.org
Sun Jun 5 23:07:22 EEST 2005
Update of /var/lib/cvs/dovecot/src/lib-mail
In directory talvi:/tmp/cvs-serv983
Modified Files:
message-date.c
Log Message:
Make date parser use rfc822-parser API.
Index: message-date.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-date.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- message-date.c 3 Oct 2003 15:15:20 -0000 1.10
+++ message-date.c 5 Jun 2005 20:07:20 -0000 1.11
@@ -1,13 +1,19 @@
-/* Copyright (C) 2002 Timo Sirainen */
+/* Copyright (C) 2002-2005 Timo Sirainen */
#include "lib.h"
+#include "str.h"
#include "utc-offset.h"
#include "utc-mktime.h"
-#include "message-tokenize.h"
+#include "rfc822-parser.h"
#include "message-date.h"
#include <ctype.h>
+struct message_date_parser_context {
+ struct rfc822_parser_context parser;
+ string_t *str;
+};
+
static const char *month_names[] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
@@ -86,41 +92,47 @@
return 0;
}
-static enum message_token next_token(struct message_tokenizer *ctx,
- const unsigned char **value,
- size_t *value_len)
+static int next_token(struct message_date_parser_context *ctx,
+ const unsigned char **value, size_t *value_len)
{
- enum message_token token;
+ int ret;
- token = message_tokenize_next(ctx);
- if (token == 'A')
- *value = message_tokenize_get_value(ctx, value_len);
- return token;
+ str_truncate(ctx->str, 0);
+ ret = rfc822_parse_atom(&ctx->parser, ctx->str);
+
+ *value = str_data(ctx->str);
+ *value_len = str_len(ctx->str);
+ return ret < 0 ? -1 : *value_len > 0;
}
-static int mail_date_parse_tokens(struct message_tokenizer *ctx, time_t *time,
- int *timezone_offset)
+static int message_date_parser_tokens(struct message_date_parser_context *ctx,
+ time_t *time, int *timezone_offset)
{
struct tm tm;
- enum message_token token;
const unsigned char *value;
size_t i, len;
+ int ret;
/* [weekday_name "," ] dd month_name [yy]yy hh:mi[:ss] timezone */
memset(&tm, 0, sizeof(tm));
+ (void)rfc822_skip_lwsp(&ctx->parser);
+
/* skip the optional weekday */
- token = next_token(ctx, &value, &len);
- if (token == 'A' && len == 3) {
- token = next_token(ctx, &value, &len);
- if (token != ',')
+ if (next_token(ctx, &value, &len) <= 0)
+ return FALSE;
+ if (len == 3) {
+ if (*ctx->parser.data != ',')
return FALSE;
+ ctx->parser.data++;
+ (void)rfc822_skip_lwsp(&ctx->parser);
- token = next_token(ctx, &value, &len);
+ if (next_token(ctx, &value, &len) <= 0)
+ return FALSE;
}
/* dd */
- if (token != 'A' || len < 1 || len > 2 || !i_isdigit(value[0]))
+ if (len < 1 || len > 2 || !i_isdigit(value[0]))
return FALSE;
tm.tm_mday = value[0]-'0';
@@ -131,8 +143,7 @@
}
/* month name */
- token = next_token(ctx, &value, &len);
- if (token != 'A' || len < 3)
+ if (next_token(ctx, &value, &len) <= 0 || len < 3)
return FALSE;
for (i = 0; i < 12; i++) {
@@ -145,8 +156,7 @@
return FALSE;
/* [yy]yy */
- token = next_token(ctx, &value, &len);
- if (token != 'A' || (len != 2 && len != 4))
+ if (next_token(ctx, &value, &len) <= 0 || (len != 2 && len != 4))
return FALSE;
for (i = 0; i < len; i++) {
@@ -166,8 +176,8 @@
}
/* hh, allow also single digit */
- token = next_token(ctx, &value, &len);
- if (token != 'A' || len < 1 || len > 2 || !i_isdigit(value[0]))
+ if (next_token(ctx, &value, &len) <= 0 ||
+ len < 1 || len > 2 || !i_isdigit(value[0]))
return FALSE;
tm.tm_hour = value[0]-'0';
if (len == 2) {
@@ -176,35 +186,35 @@
tm.tm_hour = tm.tm_hour * 10 + (value[1]-'0');
}
- /* :mm */
- token = next_token(ctx, &value, &len);
- if (token != ':')
+ /* :mm (may be the last token) */
+ if (*ctx->parser.data != ':')
return FALSE;
- token = next_token(ctx, &value, &len);
- if (token != 'A' || len != 2 ||
+ ctx->parser.data++;
+ (void)rfc822_skip_lwsp(&ctx->parser);
+
+ if (next_token(ctx, &value, &len) < 0 || len != 2 ||
!i_isdigit(value[0]) || !i_isdigit(value[1]))
return FALSE;
tm.tm_min = (value[0]-'0') * 10 + (value[1]-'0');
/* [:ss] */
- token = next_token(ctx, &value, &len);
- if (token == ':') {
- token = next_token(ctx, &value, &len);
- if (token != 'A' || len != 2 ||
+ if (ctx->parser.data != ctx->parser.end && *ctx->parser.data == ':') {
+ ctx->parser.data++;
+ (void)rfc822_skip_lwsp(&ctx->parser);
+
+ if (next_token(ctx, &value, &len) <= 0 || len != 2 ||
!i_isdigit(value[0]) || !i_isdigit(value[1]))
return FALSE;
tm.tm_sec = (value[0]-'0') * 10 + (value[1]-'0');
-
- token = next_token(ctx, &value, &len);
}
- if (token == TOKEN_LAST) {
+ if ((ret = next_token(ctx, &value, &len)) < 0)
+ return FALSE;
+ if (ret == 0) {
/* missing timezone */
*timezone_offset = 0;
} else {
/* timezone */
- if (token != 'A')
- return FALSE;
*timezone_offset = parse_timezone(value, len);
}
@@ -221,15 +231,14 @@
int message_date_parse(const unsigned char *data, size_t size,
time_t *time, int *timezone_offset)
{
- struct message_tokenizer *ctx;
+ struct message_date_parser_context ctx;
int ret;
- if (data == NULL || *data == '\0')
- return FALSE;
-
- ctx = message_tokenize_init(data, size, NULL, NULL);
- ret = mail_date_parse_tokens(ctx, time, timezone_offset);
- message_tokenize_deinit(ctx);
+ t_push();
+ rfc822_parser_init(&ctx.parser, data, size, NULL);
+ ctx.str = t_str_new(128);
+ ret = message_date_parser_tokens(&ctx, time, timezone_offset);
+ t_pop();
return ret;
}
More information about the dovecot-cvs
mailing list