Added support for multi-line header lines
authorJoey Schulze <joey@infodrom.org>
Sat, 4 Dec 2004 10:07:12 +0000 (10:07 +0000)
committerJoey Schulze <joey@infodrom.org>
Sat, 4 Dec 2004 10:07:12 +0000 (10:07 +0000)
mbox.c

diff --git a/mbox.c b/mbox.c
index c9791a4..a15b9e2 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -36,6 +36,7 @@ struct mail {
 };
 
 #define HDR_LEN        128
+#define TAB    0x09
 
 /*
  * Like strncpy() but with terminated result.
@@ -154,6 +155,7 @@ int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
   int inheader = 1;
   int readnewline = 0;
   int newmail = 0;
+  int lookahead;
 
   char from_[HDR_LEN] = "";
   char from[HDR_LEN] = "";
@@ -177,7 +179,32 @@ int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
       buf[strlen(buf)-1] = '\0';
       if (strlen(buf) > 0 && buf[strlen(buf)-1] == '\r')
        buf[strlen(buf)-1] = '\0';
+
+      if (inheader && !feof(f)) {
+       lookahead = fgetc(f);
+       if (lookahead == TAB) {
+         if ((cp = fgets(tmp, sizeof(tmp), f)) != NULL) {
+           strncat(buf, tmp, sizeof(buf)-strlen(buf)-1);
+           if (strlen(buf) > 0 && buf[strlen(buf)-1] == '\n')
+             buf[strlen(buf)-1] = '\0';
+           if (strlen(buf) > 0 && buf[strlen(buf)-1] == '\r')
+             buf[strlen(buf)-1] = '\0';
+
+           if (strlen(tmp) > 0 && buf[strlen(tmp)-1] == '\n') {
+             /* Read the remainder */
+             while (!feof(f) && fgets(tmp, sizeof(tmp), f) != NULL) {
+               if (strlen(tmp) > 0 && tmp[strlen(tmp)-1] == '\n')
+                 break;
+             }
+           }
+         }
+       } else
+         /* Rewind by one character for next read */
+         if (lookahead != EOF)
+           fseek(f, -1, SEEK_CUR);
+      }
     } else {
+      /* Read the remainder */
       while (!feof(f) && fgets(tmp, sizeof(tmp), f) != NULL) {
        if (strlen(tmp) > 0 && tmp[strlen(tmp)-1] == '\n')
          break;