From bf016a819708d2f84387843e73af51df7e19c621 Mon Sep 17 00:00:00 2001 From: markus schnalke Date: Thu, 12 Nov 2015 17:05:53 +0100 Subject: [PATCH] Convert rcvdist and repl from m_getfld() to m_getfld2() --- uip/rcvdist.c | 74 ++++++++++----------------------------- uip/repl.c | 109 ++++++++++++++++++--------------------------------------- 2 files changed, 54 insertions(+), 129 deletions(-) diff --git a/uip/rcvdist.c b/uip/rcvdist.c index 53cc0f0..8292a20 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -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); } diff --git a/uip/repl.c b/uip/repl.c index f5df9ec..d71f27b 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -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 */ -- 1.7.10.4