X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fwhom.c;h=ef0b684d2a011817a34dd01cc7c86ba3b26190a6;hp=b987356f108708b01c453103ce3632ff521c765a;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=9cf6132a6ea29968131a000bc2fb6860affac45e diff --git a/uip/whom.c b/uip/whom.c index b987356..ef0b684 100644 --- a/uip/whom.c +++ b/uip/whom.c @@ -37,6 +37,7 @@ static struct swit switches[] = { { NULL, 0 } }; +char *version=VERSION; #define NFILES 32 @@ -75,11 +76,15 @@ static void printone(struct mailname *); int main(int argc, char **argv) { - int filep=0, naddrs=0, n; + int naddrs=0, n; char *cp; char buf[BUFSIZ], **argp; - char **arguments, *files[NFILES]; + char **arguments; + char *folder = NULL; FILE *in; + struct msgs_array msgs = {0}; + struct msgs_array files = {0}; + size_t filep; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); @@ -139,22 +144,27 @@ main(int argc, char **argv) continue; } } - if (filep > NFILES) { - adios(EX_USAGE, NULL, "too many files (more than %d)", - NFILES); + if (*cp == '+' || *cp == '@') { + if (folder) { + adios(EX_USAGE, NULL, "only one folder at a time!"); + } else { + folder = mh_xstrdup(expandfol(cp)); + } } else { - files[filep++] = cp; + app_msgarg(&msgs, cp); } } - files[filep] = NULL; - if (!filep) { + if (!msgs.size) { adios(EX_USAGE, NULL, "usage: %s [switches] file ...", invo_name); } if (!toccsw && !dccsw && !bccsw) { adios(EX_USAGE, NULL, "use at least one of: -tocc -dcc -bcc"); } - for (filep=0; files[filep]; filep++) { - process(files[filep]); + if (parse_msgs(&msgs, folder, &files) < 0) { + exit(EX_IOERR); + } + for (filep = 0; filep < files.size; filep++) { + process(files.msgs[filep]); } cmd = add("ali -list", NULL); @@ -203,9 +213,9 @@ main(int argc, char **argv) static int process(char *file) { - int state, compnum; - char *cp = NULL; - char buf[BUFSIZ], name[NAMESZ]; + enum state state; + struct field f = {{0}}; + int compnum; FILE *in; @@ -213,31 +223,24 @@ process(char *file) adios(EX_IOERR, file, "unable to open"); } - for (compnum = 1, state = FLD;;) { - switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { - case FLD: - compnum++; - proc_hdr(name, buf); + for (compnum=1, state=FLD2;; compnum++) { + switch (state = m_getfld2(state, &f, in)) { + case LENERR2: + state = FLD2; + /* FALL */ + case FLD2: + proc_hdr(f.name, f.value); continue; - case FLDPLUS: - compnum++; - cp = mh_xstrdup(buf); - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof(buf), in); - cp = add(buf, cp); - } - proc_hdr(name, cp); - mh_free0(&cp); - continue; - - case BODY: - case FILEEOF: + case BODY2: + case FILEEOF2: break; - case LENERR: - case FMTERR: + case FMTERR2: + advise(NULL, "message format error in component #%d", compnum); + continue; + + case IOERR2: adios(EX_DATAERR, NULL, "message format error in component #%d", compnum);