2 * Mailbox Parser (so far very primitive)
4 * (c) 2010 Martin Mares <mj@ucw.cz>
14 const char progname[] = "mparse";
18 static char buf[BUFSIZE];
19 static char *bpos=buf, *bend=buf;
21 static char *get_line(void)
28 int remains = bend - bpos;
31 char *nl = memchr(bpos, '\n', remains);
35 if (nl > p && nl[-1] == '\r')
41 memmove(buf, bpos, remains);
46 int space = BUFSIZE - remains;
49 int len = read(0, bend, space);
51 die("Read error: %m");
66 static int want_header(char *line, char **want, int n_want)
71 for (int i=0; i<n_want; i++)
73 int len = strlen(want[i]);
74 if (!strncasecmp(line, want[i], len))
88 main(int argc, char **argv)
91 enum state state = S_INITIAL;
94 while (c = get_line())
96 // printf("<%s>\n", c);
97 if (state == S_INITIAL || state == S_BODY)
99 if (!strncmp(c, "From ", 5))
112 else if (*c == ' ' || *c == '\t')
116 while (*c == ' ' || *c == '\t')
124 want = want_header(c, argv+1, argc-1);
134 if (state == S_HEADER)
135 printf("\nX-Warning: Incomplete mail\n\n");