2007-06-04 [wwp] 2.9.2cvs32
authorTristan Chabredier <wwp@claws-mail.org>
Mon, 4 Jun 2007 13:15:02 +0000 (13:15 +0000)
committerTristan Chabredier <wwp@claws-mail.org>
Mon, 4 Jun 2007 13:15:02 +0000 (13:15 +0000)
* 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
PATCHSETS
configure.ac
src/common/utils.c
src/common/utils.h
src/procheader.c

index 91caf06ed3252454368395586f8bbdec0bd5aa4e..a50a7f8e59854e39eec152032b5c91d3b9089f50 100644 (file)
--- 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
index 8e64a41997b7542a3c493eb23466318cdcbd3251..8d174490210d176c22f22e1666d96aa498431fe1 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index b510808661b1c8a71f5c477bccd5f63cf942b471..6281cca51df770e892ff4967c40424ca7b07a924 100644 (file)
@@ -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=
 
index fbe776fcd736dbde3437f6d86a693304772ca714..930592f3cb4a836b3980db95441708779d70a2aa 100644 (file)
@@ -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);
index 65779c101a2b39661abd5dc653ac4caf02f6b0b9..294df6de8da4ddb346ede6c06f8ad9c48cd966f0 100644 (file)
@@ -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);
index 56d565cf58ffb7cbfd6175ec2cabb9e004dd6c96..2cad299a194896ca7e1b88429c080994a2580d2f 100644 (file)
@@ -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];