Fix uip/whom.c for C89 compatibility
[mmh] / uip / repl.c
index 71ae98e..b2adebf 100644 (file)
@@ -60,6 +60,8 @@ static struct swit switches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
+
 static struct swit ccswitches[] = {
 #define CTOSW  0
        { "to", 0 },
@@ -72,15 +74,6 @@ static struct swit ccswitches[] = {
        { NULL, 0 }
 };
 
-/*
-** Buffer size for content part of header fields.
-** We want this to be large enough so that we don't
-** do a lot of extra FLDPLUS calls on m_getfld but
-** small enough so that we don't snarf the entire
-** message body when we're not going to use any of it.
-*/
-#define SBUFSIZ 256
-
 static short ccto = -1;
 static short cccc = -1;
 static short ccme = -1;
@@ -102,8 +95,6 @@ static struct mailname mq;
 static struct format *fmt;
 
 static int ncomps = 0;  /* # of interesting components */
-static char **compbuffers = NULL;  /* buffers for component text */
-static struct comp **used_buf = NULL;  /* stack for comp that use buffers */
 
 static int dat[5];  /* aux. data for format routine */
 
@@ -145,14 +136,14 @@ main(int argc, char **argv)
        FILE *in;
        int buildsw = 0;
 
-       filter = getcpy(etcpath(mhlreply));
-
        setlocale(LC_ALL, "");
        invo_name = mhbasename(argv[0]);
 
        /* read user profile/context */
        context_read();
 
+       filter = mh_xstrdup(etcpath(mhlreply));
+
        arguments = getarguments(invo_name, argc, argv, 1);
        argp = arguments;
 
@@ -223,7 +214,7 @@ main(int argc, char **argv)
                                if (!(cp = *argp++) || *cp == '-')
                                        adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
-                               file = getcpy(expanddir(cp));
+                               file = mh_xstrdup(expanddir(cp));
                                continue;
                        case FORMSW:
                                if (!(form = *argp++) || *form == '-')
@@ -235,7 +226,7 @@ main(int argc, char **argv)
                                if (!(cp = *argp++) || *cp == '-')
                                        adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
-                               filter = getcpy(etcpath(cp));
+                               filter = mh_xstrdup(etcpath(cp));
                                continue;
                        case NFILTSW:
                                filter = NULL;
@@ -261,7 +252,7 @@ main(int argc, char **argv)
                        if (folder)
                                adios(EX_USAGE, NULL, "only one folder at a time!");
                        else
-                               folder = getcpy(expandfol(cp));
+                               folder = mh_xstrdup(expandfol(cp));
                } else {
                        if (msg)
                                adios(EX_USAGE, NULL, "only one message at a time!");
@@ -277,7 +268,7 @@ main(int argc, char **argv)
        if (ccme == -1)
                ccme = groupreply;
 
-       cwd = getcpy(pwd());
+       cwd = mh_xstrdup(pwd());
 
        if (file && (msg || folder))
                adios(EX_USAGE, NULL, "can't mix files and folders/msgs");
@@ -331,7 +322,7 @@ main(int argc, char **argv)
                context_save();  /* save the context file   */
        }
 
-       msg = file ? file : getcpy(m_name(mp->lowsel));
+       msg = file ? file : mh_xstrdup(m_name(mp->lowsel));
 
        if ((in = fopen(msg, "r")) == NULL)
                adios(EX_IOERR, msg, "unable to open");
@@ -388,14 +379,13 @@ static void
 replout(FILE *inb, char *drft, struct msgs *mp,
        int mime, char *form, char *filter)
 {
-       int state, i;
+       enum state state;
+       struct field f = {{0}};
+       int i;
        struct comp *cptr;
-       char *tmpbuf;
-       char **nxtbuf;
        char **ap;
-       struct comp **savecomp;
        int char_read = 0, format_len, mask;
-       char name[NAMESZ], *scanl;
+       char *scanl;
        unsigned char *cp;
        FILE *out;
 
@@ -412,19 +402,6 @@ replout(FILE *inb, char *drft, struct msgs *mp,
        /* compile format string */
        ncomps = fmt_compile(cp, &fmt) + 1;
 
-       nxtbuf = compbuffers = (char **)
-                       mh_xcalloc((size_t) ncomps, sizeof(char *));
-       savecomp = used_buf = (struct comp **)
-                       mh_xcalloc((size_t) (ncomps+1), sizeof(struct comp *));
-       savecomp += ncomps + 1;
-       *--savecomp = NULL;  /* point at zero'd end minus 1 */
-
-       for (i = ncomps; i--; )
-               *nxtbuf++ = mh_xmalloc(SBUFSIZ);
-
-       nxtbuf = compbuffers;  /* point at start */
-       tmpbuf = *nxtbuf++;
-
        for (ap = addrcomps; *ap; ap++) {
                FINDCOMP(cptr, *ap);
                if (cptr)
@@ -447,7 +424,7 @@ replout(FILE *inb, char *drft, struct msgs *mp,
        if ((cp = getenv("USER"))) {
                FINDCOMP(cptr, "user");
                if (cptr)
-                       cptr->c_text = getcpy(cp);
+                       cptr->c_text = mh_xstrdup(cp);
        }
        if (!ccme)
                ismymbox(NULL);
@@ -455,11 +432,10 @@ replout(FILE *inb, char *drft, struct msgs *mp,
        /*
        ** pick any interesting stuff out of msg "inb"
        */
-       for (state = FLD;;) {
-               state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb);
+       for (state = FLD2;;) {
+               state = m_getfld2(state, &f, inb);
                switch (state) {
-               case FLD:
-               case FLDPLUS:
+               case FLD2:
                        /*
                        ** if we're interested in this component, save
                        ** a pointer to the component text, then start
@@ -467,47 +443,41 @@ replout(FILE *inb, char *drft, struct msgs *mp,
                        ** temp buffer (buffer switching saves an extra
                        ** copy of the component text).
                        */
-                       if ((cptr = wantcomp[CHASH(name)]))
+                       if ((cptr = wantcomp[CHASH(f.name)])) {
                                do {
-                                       if (!mh_strcasecmp(name, cptr->c_name)) {
-                                               char_read += msg_count;
-                                               if (! cptr->c_text) {
-                                                       i = strlen(cptr->c_text = tmpbuf) - 1;
-                                                       if (tmpbuf[i] == '\n')
-                                                               tmpbuf[i] = '\0';
-                                                       *--savecomp = cptr;
-                                                       tmpbuf = *nxtbuf++;
-                                               } else {
-                                                       i = strlen(cp = cptr->c_text) - 1;
-                                                       if (cp[i] == '\n') {
-                                                               if (cptr->c_type & CT_ADDR) {
-                                                                       cp[i] = '\0';
-                                                                       cp = add(",\n\t", cp);
-                                                               } else {
-                                                                       cp = add("\t", cp);
-                                                               }
-                                                       }
-                                                       cptr->c_text = add(tmpbuf, cp);
+                                       if (mh_strcasecmp(f.name, cptr->c_name)!=0) {
+                                               continue;
+                                       }
+                                       char_read += strlen(f.value);
+                                       if (!cptr->c_text) {
+                                               cptr->c_text = mh_xstrdup(f.value);
+                                               i = strlen(cptr->c_text) - 1;
+                                               if (cptr->c_text[i] == '\n') {
+                                                       cptr->c_text[i] = '\0';
                                                }
-                                               while (state == FLDPLUS) {
-                                                       state = m_getfld(state, name, tmpbuf,
-                                                                                         SBUFSIZ, inb);
-                                                       cptr->c_text = add(tmpbuf, cptr->c_text);
-                                                       char_read += msg_count;
+                                       } else {
+                                               cp = cptr->c_text;
+                                               i = strlen(cp) - 1;
+                                               if (cp[i] == '\n') {
+                                                       if (cptr->c_type & CT_ADDR) {
+                                                               cp[i] = '\0';
+                                                               cp = add(",\n\t", cp);
+                                                       } else {
+                                                               cp = add("\t", cp);
+                                                       }
                                                }
-                                               break;
+                                               cptr->c_text = add(f.value, cp);
                                        }
+                                       break;
                                } while ((cptr = cptr->c_next));
-
-                       while (state == FLDPLUS)
-                               state = m_getfld(state, name, tmpbuf,
-                                               SBUFSIZ, inb);
+                       }
                        break;
 
-               case LENERR:
-               case FMTERR:
-               case BODY:
-               case FILEEOF:
+               case LENERR2:
+               case FMTERR2:
+               case IOERR2:
+               case BODY2:
+               case FILEEOF2:
                        goto finished;
 
                default:
@@ -538,12 +508,12 @@ finished:
                }
                if (sp != cptr->c_text) {
                        cp = cptr->c_text;
-                       cptr->c_text = getcpy(sp);
-                       free(cp);
+                       cptr->c_text = mh_xstrdup(sp);
+                       mh_free0(&cp);
                }
        }
        i = format_len + char_read + 256;
-       scanl = mh_xmalloc((size_t) i + 2);
+       scanl = mh_xcalloc(i + 2, sizeof(char));
        dat[0] = 0;
        dat[1] = 0;
        dat[2] = 0;
@@ -584,14 +554,7 @@ finished:
        }
 
        /* return dynamically allocated buffers */
-       free(scanl);
-       for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++);
-                       nxtbuf++, i--)
-               free(cptr->c_text);  /* if not nxtbuf, nxtbuf already freed */
-       while ( i-- > 0)
-               free(*nxtbuf++);  /* free unused nxtbufs */
-       free((char *) compbuffers);
-       free((char *) used_buf);
+       mh_free0(&scanl);
 }
 
 static char *buf;  /* our current working buffer */
@@ -627,7 +590,7 @@ static unsigned int bufsiz=0;  /* current size of buf */
 ** returns a pointer to the concatenated address string.
 **
 ** We try to not do a lot of malloc/copy/free's (which is why we
-** don't call "getcpy") but still place no upper limit on the
+** don't call "mh_xstrdup") but still place no upper limit on the
 ** length of the result string.
 **
 ** This routine is an override for the equally named one in sbr/fmt_addr.c.
@@ -646,7 +609,7 @@ formataddr(char *orig, char *str)
 
        /* if we don't have a buffer yet, get one */
        if (bufsiz == 0) {
-               buf = mh_xmalloc(BUFINCR);
+               buf = mh_xcalloc(BUFINCR, sizeof(char));
                last_dst = buf;  /* XXX */
                bufsiz = BUFINCR - 6;  /* leave some slop */
                bufend = buf + bufsiz;
@@ -742,7 +705,6 @@ replfilter(FILE *in, FILE *out, char *filter)
 {
        int pid, pid_show, n;
        int mailpipe[2];
-       char *errstr;
 
        if (filter == NULL)
                return;
@@ -753,51 +715,51 @@ replfilter(FILE *in, FILE *out, char *filter)
        rewind(in);
        lseek(fileno(in), (off_t) 0, SEEK_SET);
 
-       if (pipe(mailpipe) == -1) {
-               adios(EX_OSERR, "pipe", "can't create pipe");
-       }
-
-       switch (pid_show = fork()) {
-       case NOTOK:
-               adios(EX_OSERR, "fork", "unable to");
-
-       case OK:
-               dup2(fileno(in), fileno(stdin));
-               dup2(mailpipe[1], fileno(stdout));
-               for (n=3; n<OPEN_MAX; n++) {
-                       close(n);
-               }
-
-               execlp("show", "show", "-file", "-", NULL);
-
-               adios(EX_OSERR, "exec", "unable to");
-       }
-
        switch (pid = fork()) {
        case NOTOK:
                adios(EX_OSERR, "fork", "unable to");
 
        case OK:
-               dup2(mailpipe[0], fileno(stdin));
-               dup2(fileno(out), fileno(stdout));
-               for (n=3; n<OPEN_MAX; n++) {
-                       close(n);
+               if (pipe(mailpipe) == -1) {
+                       adios(EX_OSERR, "pipe", "can't create pipe");
                }
 
-               execlp("mhl", "mhl", "-form", filter, NULL);
-               errstr = strerror(errno);
-               write(2, "unable to exec mhl: ", 20);
-               write(2, errstr, strlen(errstr));
-               write(2, "\n", 1);
-               _exit(EX_OSERR);
+               switch (pid_show = fork()) {
+               case NOTOK:
+                       adios(EX_OSERR, "fork", "unable to");
+               case OK:
+                       dup2(fileno(in), STDIN_FILENO);
+                       dup2(mailpipe[1], STDOUT_FILENO);
+                       close(fileno(in));
+                       close(fileno(out));
+                       close(mailpipe[0]);
+                       close(mailpipe[1]);
+                       for (n=3; n<OPEN_MAX; n++) {
+                               close(n);
+                       }
+                       execlp("show", "show", "-file", "-", NULL);
+                       adios(EX_OSERR, "exec", "unable to");
+                       break;
+               default:
+                       dup2(mailpipe[0], STDIN_FILENO);
+                       dup2(fileno(out), STDOUT_FILENO);
+                       close(fileno(in));
+                       close(fileno(out));
+                       close(mailpipe[0]);
+                       close(mailpipe[1]);
+                       for (n=3; n<OPEN_MAX; n++) {
+                               close(n);
+                       }
+                       execlp("mhl", "mhl", "-form", filter, NULL);
+                       adios(EX_OSERR, "exec", "unable to");
+                       break;
+               }
 
        default:
-               if (pidXwait(-1, "show | mhl"))
+               if (pidXwait(pid, "mhl")) {
                        exit(EX_SOFTWARE);
+               }
                fseek(out, 0L, SEEK_END);
                break;
        }
-
-       close(mailpipe[0]);
-       close(mailpipe[1]);
 }