Fix uip/whom.c for C89 compatibility
[mmh] / uip / rcvdist.c
index 4027ea2..af3fc10 100644 (file)
@@ -26,6 +26,8 @@ static struct swit switches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
+
 static char backup[BUFSIZ] = "";
 static char drft[BUFSIZ] = "";
 static char tmpfil[BUFSIZ] = "";
@@ -85,7 +87,7 @@ main(int argc, char **argv)
                                continue;
                        }
                }
-               addrs = addrs ? add(cp, add(", ", addrs)) : getcpy(cp);
+               addrs = addrs ? add(cp, add(", ", addrs)) : mh_xstrdup(cp);
        }
 
        if (!addrs) {
@@ -126,13 +128,9 @@ main(int argc, char **argv)
 
 /* very similar to routine in replsbr.c */
 
-#define SBUFSIZ 256
-
 static struct format *fmt;
 
 static int ncomps = 0;
-static char **compbuffers = 0;
-static struct comp **used_buf = 0;
 
 static int dat[5];
 
@@ -156,10 +154,12 @@ static char *addrcomps[] = {
 static void
 rcvdistout(FILE *inb, char *form, char *addrs)
 {
-       register int char_read = 0, format_len, i, state;
-       register char *tmpbuf, **nxtbuf, **ap;
-       char *cp, *scanl, name[NAMESZ];
-       register struct comp *cptr, **savecomp;
+       int char_read = 0, format_len, i;
+       enum state state;
+       struct field f = {{0}};
+       char **ap;
+       char *cp, *scanl;
+       struct comp *cptr;
        FILE *out;
 
        if (!(out = fopen(drft, "w"))) {
@@ -170,23 +170,6 @@ rcvdistout(FILE *inb, char *form, char *addrs)
        cp = new_fs(form ? form : rcvdistcomps, NULL);
        format_len = strlen(cp);
        ncomps = fmt_compile(cp, &fmt) + 1;
-       if (!(nxtbuf = compbuffers =
-                       (char **) calloc((size_t) ncomps, sizeof(char *)))) {
-               adios(EX_OSERR, NULL, "unable to allocate component buffers");
-       }
-       if (!(savecomp = used_buf =
-                       (struct comp **) calloc((size_t) (ncomps + 1),
-                       sizeof(struct comp *)))) {
-               adios(EX_OSERR, NULL, "unable to allocate component buffer stack");
-       }
-       savecomp += ncomps + 1;
-       *--savecomp = 0;
-
-       for (i = ncomps; i--;) {
-               *nxtbuf++ = mh_xmalloc(SBUFSIZ);
-       }
-       nxtbuf = compbuffers;
-       tmpbuf = *nxtbuf++;
 
        for (ap = addrcomps; *ap; ap++) {
                FINDCOMP(cptr, *ap);
@@ -199,22 +182,19 @@ rcvdistout(FILE *inb, char *form, char *addrs)
        if (cptr) {
                cptr->c_text = addrs;
        }
-       state = FLD;
+       state = FLD2;
        while (1) {
-               state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb);
+               state = m_getfld2(state, &f, inb);
                switch (state) {
-               case FLD:
-               case FLDPLUS:
-                       if ((cptr = wantcomp[CHASH(name)])) {
+               case FLD2:
+                       if ((cptr = wantcomp[CHASH(f.name)])) {
                                do {
-                                       if (mh_strcasecmp(name, cptr->c_name)!=0) {
+                                       if (mh_strcasecmp(f.name, cptr->c_name)!=0) {
                                                continue;
                                        }
-                                       char_read += msg_count;
+                                       char_read += strlen(f.value);
                                        if (!cptr->c_text) {
-                                               cptr->c_text = tmpbuf;
-                                               *--savecomp = cptr;
-                                               tmpbuf = *nxtbuf++;
+                                               cptr->c_text = mh_xstrdup(f.value);
                                        } else {
                                                cp = cptr->c_text;
                                                i = strlen(cp) - 1;
@@ -226,27 +206,18 @@ rcvdistout(FILE *inb, char *form, char *addrs)
                                                                cp = add("\t", cp);
                                                        }
                                                }
-                                               cptr->c_text = add(tmpbuf, cp);
-                                       }
-                                       while (state == FLDPLUS) {
-                                               state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb);
-                                               cptr->c_text = add(tmpbuf, cptr->c_text);
-                                               char_read += msg_count;
+                                               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:
@@ -256,7 +227,7 @@ rcvdistout(FILE *inb, char *form, char *addrs)
 finished: ;
 
        i = format_len + char_read + 256;
-       scanl = mh_xmalloc((size_t) i + 2);
+       scanl = mh_xcalloc(i + 2, sizeof(char));
        dat[0] = dat[1] = dat[2] = dat[4] = 0;
        dat[3] = OUTPUTLINELEN;
        fmt_scan(fmt, scanl, i, dat);
@@ -267,16 +238,7 @@ finished: ;
        }
        fclose(out);
 
-       free(scanl);
-       for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++);
-                       nxtbuf++, i--) {
-               free(cptr->c_text);
-       }
-       while (i-- > 0) {
-               free(*nxtbuf++);
-       }
-       free(compbuffers);
-       free(used_buf);
+       mh_free0(&scanl);
 }