headerbody.c
changeset 0 068428edee47
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/headerbody.c	Fri Oct 19 14:06:22 2007 +0200
@@ -0,0 +1,87 @@
+#include "stralloc.h"
+#include "substdio.h"
+#include "getln.h"
+#include "hfield.h"
+#include "headerbody.h"
+
+static int getsa(ss,sa,match)
+substdio *ss;
+stralloc *sa;
+int *match;
+{
+ if (!*match) return 0;
+ if (getln(ss,sa,match,'\n') == -1) return -1;
+ if (*match) return 1;
+ if (!sa->len) return 0;
+ if (!stralloc_append(sa,"\n")) return -1;
+ return 1;
+}
+
+static stralloc line = {0};
+static stralloc nextline = {0};
+
+int headerbody(ss,dohf,hdone,dobl)
+substdio *ss;
+void (*dohf)();
+void (*hdone)();
+void (*dobl)();
+{
+ int match;
+ int flaglineok;
+ match = 1;
+ flaglineok = 0;
+ for (;;)
+  {
+   switch(getsa(ss,&nextline,&match))
+    {
+     case -1:
+       return -1;
+     case 0:
+       if (flaglineok) dohf(&line);
+       hdone();
+       /* no message body; could insert blank line here */
+       return 0;
+    }
+   if (flaglineok)
+    {
+     if ((nextline.s[0] == ' ') || (nextline.s[0] == '\t'))
+      {
+       if (!stralloc_cat(&line,&nextline)) return -1;
+       continue;
+      }
+     dohf(&line);
+    }
+   if (nextline.len == 1)
+    {
+     hdone();
+     dobl(&nextline);
+     break;
+    }
+   if (stralloc_starts(&nextline,"From "))
+    {
+     if (!stralloc_copys(&line,"MBOX-Line: ")) return -1;
+     if (!stralloc_cat(&line,&nextline)) return -1;
+    }
+   else
+     if (hfield_valid(nextline.s,nextline.len))
+      {
+       if (!stralloc_copy(&line,&nextline)) return -1;
+      }
+     else
+      {
+       hdone();
+       if (!stralloc_copys(&line,"\n")) return -1;
+       dobl(&line);
+       dobl(&nextline);
+       break;
+      }
+   flaglineok = 1;
+  }
+ for (;;)
+   switch(getsa(ss,&nextline,&match))
+    {
+     case -1: return -1;
+     case 0: return 0;
+     case 1: dobl(&nextline);
+    }
+}