Convert rcvdist and repl from m_getfld() to m_getfld2()
authormarkus schnalke <meillo@marmaro.de>
Thu, 12 Nov 2015 16:05:53 +0000 (17:05 +0100)
committermarkus schnalke <meillo@marmaro.de>
Thu, 12 Nov 2015 21:42:18 +0000 (22:42 +0100)
uip/rcvdist.c
uip/repl.c

index 53cc0f0..8292a20 100644 (file)
@@ -126,13 +126,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 +152,12 @@ static char *addrcomps[] = {
 static void
 rcvdistout(FILE *inb, char *form, char *addrs)
 {
-       int char_read = 0, format_len, i, state;
-       char *tmpbuf, **nxtbuf, **ap;
-       char *cp, *scanl, name[NAMESZ];
-       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,19 +168,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;
-       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 = 0;
-
-       for (i = ncomps; i--;) {
-               *nxtbuf++ = mh_xmalloc(SBUFSIZ);
-       }
-       nxtbuf = compbuffers;
-       tmpbuf = *nxtbuf++;
 
        for (ap = addrcomps; *ap; ap++) {
                FINDCOMP(cptr, *ap);
@@ -195,22 +180,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 = getcpy(f.value);
                                        } else {
                                                cp = cptr->c_text;
                                                i = strlen(cp) - 1;
@@ -222,27 +204,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:
@@ -264,15 +237,6 @@ 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);
 }
 
 
index f5df9ec..d71f27b 100644 (file)
@@ -72,15 +72,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 +93,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 */
 
@@ -388,14 +377,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 +400,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)
@@ -455,11 +430,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 +441,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 = getcpy(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:
@@ -585,13 +553,6 @@ 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);
 }
 
 static char *buf;  /* our current working buffer */