X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frepl.c;h=b2adebfea5cd53b1d668490ab1e37b10da5f1242;hp=505160ecec629e50f7003cc48acaa498b7576a0d;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=d4c34b4439a9dbd89664de460ed37ecddc260fb1 diff --git a/uip/repl.c b/uip/repl.c index 505160e..b2adebf 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -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 */ @@ -151,7 +142,7 @@ main(int argc, char **argv) /* read user profile/context */ context_read(); - filter = getcpy(etcpath(mhlreply)); + 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,17 +402,6 @@ replout(FILE *inb, char *drft, struct msgs *mp, /* compile format string */ ncomps = fmt_compile(cp, &fmt) + 1; - nxtbuf = compbuffers = mh_xcalloc(ncomps, sizeof(char *)); - savecomp = used_buf = mh_xcalloc(ncomps+1, sizeof(struct comp *)); - savecomp += ncomps + 1; - *--savecomp = NULL; /* point at zero'd end minus 1 */ - - for (i = ncomps; i--; ) - *nxtbuf++ = mh_xcalloc(SBUFSIZ, sizeof(char)); - - nxtbuf = compbuffers; /* point at start */ - tmpbuf = *nxtbuf++; - for (ap = addrcomps; *ap; ap++) { FINDCOMP(cptr, *ap); if (cptr) @@ -445,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); @@ -453,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 @@ -465,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: @@ -536,7 +508,7 @@ finished: } if (sp != cptr->c_text) { cp = cptr->c_text; - cptr->c_text = getcpy(sp); + cptr->c_text = mh_xstrdup(sp); mh_free0(&cp); } } @@ -583,13 +555,6 @@ finished: /* return dynamically allocated buffers */ mh_free0(&scanl); - for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); - nxtbuf++, i--) - mh_free0(&(cptr->c_text)); /* if not nxtbuf, nxtbuf already freed */ - while ( i-- > 0) - mh_free0(nxtbuf++); /* free unused nxtbufs */ - mh_free0(&compbuffers); - mh_free0(&used_buf); } static char *buf; /* our current working buffer */ @@ -625,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. @@ -740,7 +705,6 @@ replfilter(FILE *in, FILE *out, char *filter) { int pid, pid_show, n; int mailpipe[2]; - char *errstr; if (filter == NULL) return; @@ -751,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