From e5a9c842d3837981336ed7ea991227bcaf5ba003 Mon Sep 17 00:00:00 2001 From: Tristan Chabredier Date: Mon, 4 Jun 2007 13:15:02 +0000 Subject: [PATCH] 2007-06-04 [wwp] 2.9.2cvs32 * src/procheader.c * src/common/utils.c * src/common/utils.h Support CRLF in headers part of messages. Support few more date formats (RFC3339 subsets). --- ChangeLog | 8 +++++++ PATCHSETS | 1 + configure.ac | 2 +- src/common/utils.c | 32 +++++++++++++++++++++++++++ src/common/utils.h | 2 ++ src/procheader.c | 55 +++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 93 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 91caf06ed..a50a7f8e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-06-04 [wwp] 2.9.2cvs32 + + * src/procheader.c + * src/common/utils.c + * src/common/utils.h + Support CRLF in headers part of messages. + Support few more date formats (RFC3339 subsets). + 2007-06-04 [wwp] 2.9.2cvs31 * src/prefs_account.c diff --git a/PATCHSETS b/PATCHSETS index 8e64a4199..8d1744902 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -2607,3 +2607,4 @@ ( cvs diff -u -r 1.10.2.31 -r 1.10.2.32 src/prefs_gtk.c; ) > 2.9.2cvs29.patchset ( cvs diff -u -r 1.10.2.31 -r 1.10.2.32 src/prefs_gtk.c; ) > 2.9.2cvs30.patchset ( cvs diff -u -r 1.105.2.97 -r 1.105.2.98 src/prefs_account.c; ) > 2.9.2cvs31.patchset +( cvs diff -u -r 1.47.2.42 -r 1.47.2.43 src/procheader.c; cvs diff -u -r 1.36.2.102 -r 1.36.2.103 src/common/utils.c; cvs diff -u -r 1.20.2.45 -r 1.20.2.46 src/common/utils.h; ) > 2.9.2cvs32.patchset diff --git a/configure.ac b/configure.ac index b51080866..6281cca51 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=9 MICRO_VERSION=2 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=31 +EXTRA_VERSION=32 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/common/utils.c b/src/common/utils.c index fbe776fcd..930592f3c 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -3304,6 +3304,38 @@ gchar *file_read_stream_to_str(FILE *fp) return str; } + +char *fgets_crlf(char *buf, int size, FILE *stream) +{ + gboolean is_cr = FALSE; + gboolean last_was_cr = FALSE; + int c = 0; + char *cs; + + cs = buf; + while (--size > 0 && (c = getc(stream)) != EOF) + { + *cs++ = c; + is_cr = (c == '\r'); + if (c == '\n') { + break; + } + if (last_was_cr) { + *(--cs) = '\n'; + cs++; + ungetc(c, stream); + break; + } + last_was_cr = is_cr; + } + if (c == EOF && cs == buf) + return NULL; + + *cs = '\0'; + + return buf; +} + static gint execute_async(gchar *const argv[]) { g_return_val_if_fail(argv != NULL && argv[0] != NULL, -1); diff --git a/src/common/utils.h b/src/common/utils.h index 65779c101..294df6de8 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -457,6 +457,8 @@ gint str_write_to_file (const gchar *str, gchar *file_read_to_str (const gchar *file); gchar *file_read_stream_to_str (FILE *fp); +char *fgets_crlf(char *buf, int size, FILE *stream); + /* process execution */ gint execute_command_line (const gchar *cmdline, gboolean async); diff --git a/src/procheader.c b/src/procheader.c index 56d565cf5..2cad299a1 100644 --- a/src/procheader.c +++ b/src/procheader.c @@ -37,6 +37,8 @@ #define BUFFSIZE 8192 +static gchar monthstr[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; + typedef char *(*getlinefunc) (char *, size_t, void *); typedef int (*peekcharfunc) (void *); typedef int (*getcharfunc) (void *); @@ -61,7 +63,7 @@ gint procheader_get_one_field(gchar *buf, size_t len, FILE *fp, HeaderEntry hentry[]) { return generic_get_one_field(buf, len, fp, hentry, - (getlinefunc)fgets, (peekcharfunc)file_peekchar, + (getlinefunc)fgets_crlf, (peekcharfunc)file_peekchar, TRUE); } @@ -76,12 +78,25 @@ static gint string_get_one_field(gchar *buf, size_t len, char **str, static char *string_getline(char *buf, size_t len, char **str) { + gboolean is_cr = FALSE; + gboolean last_was_cr = FALSE; + if (!*str || !**str) return NULL; - for (; **str && len > 1; --len) - if ((*buf++ = *(*str)++) == '\n') + for (; **str && len > 1; --len) { + is_cr = (**str == '\r'); + if ((*buf++ = *(*str)++) == '\n') { + break; + } + if (last_was_cr) { + *(--buf) = '\n'; + buf++; break; + } + last_was_cr = is_cr; + } + *buf = '\0'; return buf; @@ -164,7 +179,7 @@ static gint generic_get_one_field(gchar *buf, size_t len, void *data, gint procheader_get_one_field_asis(gchar *buf, size_t len, FILE *fp) { return generic_get_one_field(buf, len, fp, NULL, - (getlinefunc)fgets, + (getlinefunc)fgets_crlf, (peekcharfunc)file_peekchar, FALSE); } @@ -749,11 +764,15 @@ static gint procheader_scan_date_string(const gchar *str, gchar *zone) { gint result; + gint month_n; + gchar zone1[3]; + gchar zone2[3]; result = sscanf(str, "%10s %d %9s %d %2d:%2d:%2d %5s", weekday, day, month, year, hh, mm, ss, zone); if (result == 8) return 0; + /* RFC2822 */ result = sscanf(str, "%3s,%d %9s %d %2d:%2d:%2d %5s", weekday, day, month, year, hh, mm, ss, zone); if (result == 8) return 0; @@ -789,6 +808,32 @@ static gint procheader_scan_date_string(const gchar *str, day, month, year, hh, mm); if (result == 5) return 0; + /* RFC3339 subset */ + *weekday = '\0'; + result = sscanf(str, "%4d-%2d-%2d %2d:%2d:%2d+%2s:%2s", + year, &month_n, day, hh, mm, ss, zone1, zone2); + if (result == 8) { + if (1 <= month_n && month_n <= 12) { + strncpy2(month, monthstr+((month_n-1)*3), 4); + *zone = '+'; + strncpy2(zone+1, zone1, 3); + strncpy2(zone+3, zone2, 3); + return 0; + } + } + + /* RFC3339 subset */ + *zone = '\0'; + *weekday = '\0'; + result = sscanf(str, "%4d-%2d-%2d %2d:%2d:%2d", + year, &month_n, day, hh, mm, ss); + if (result == 6) { + if (1 <= month_n && month_n <= 12) { + strncpy2(month, monthstr+((month_n-1)*3), 4); + return 0; + } + } + return -1; } @@ -798,7 +843,6 @@ static gint procheader_scan_date_string(const gchar *str, */ gboolean procheader_date_parse_to_tm(const gchar *src, struct tm *t, char *zone) { - static gchar monthstr[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; gchar weekday[11]; gint day; gchar month[10]; @@ -851,7 +895,6 @@ gboolean procheader_date_parse_to_tm(const gchar *src, struct tm *t, char *zone) time_t procheader_date_parse(gchar *dest, const gchar *src, gint len) { - static gchar monthstr[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; gchar weekday[11]; gint day; gchar month[10]; -- 2.25.1