X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/58eaf2c22189e6cd823eb6eb3afe2e52a2599482..ef1ba39e8dae81091b6c3e73e72825ef6edea3c6:/uip/scansbr.c?ds=inline diff --git a/uip/scansbr.c b/uip/scansbr.c index 60acec90..8d2a46d2 100644 --- a/uip/scansbr.c +++ b/uip/scansbr.c @@ -14,8 +14,6 @@ #include #include -#define MAXSCANL 256 /* longest possible scan line */ - /* * 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 @@ -68,14 +66,16 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, way the code is now, with callers initializing *scanl to NULL. scanl used to be a global. */ if (! *scanl) { - if (width == 0) { + if (width == -1) { + /* Default: width of the terminal, but at least WIDTH/2. */ if ((width = sc_width ()) < WIDTH/2) width = WIDTH/2; - else if (width > MAXSCANL) - width = MAXSCANL; + } else if (width == 0) { + /* Unlimited width. */ + width = INT_MAX; } dat[3] = slwidth = width; - *scanl = charstring_create (width); + *scanl = charstring_create (width < NMH_BUFSIZ ? width : NMH_BUFSIZ); if (outnum) umask(~m_gmprot()); @@ -86,7 +86,7 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, datecomp = fmt_findcomp("date"); cptr = fmt_findcomp("folder"); if (cptr && folder) - cptr->c_text = getcpy(folder); + cptr->c_text = mh_xstrdup(folder); if (fmt_addcompentry("encrypted")) { ncomps++; } @@ -126,15 +126,12 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, * and it's our responsibility to free it. */ - nxtbuf = compbuffers = (char **) calloc((size_t) ncomps, sizeof(char *)); - if (nxtbuf == NULL) - adios (NULL, "unable to allocate component buffers"); - used_buf = (struct comp **) calloc((size_t) (ncomps+1), - sizeof(struct comp *)); - if (used_buf == NULL) - adios (NULL, "unable to allocate component buffer stack"); + nxtbuf = compbuffers = mh_xcalloc(ncomps, sizeof *nxtbuf); + used_buf = mh_xcalloc(ncomps + 1, sizeof *used_buf); used_buf += ncomps+1; *--used_buf = 0; - rlwidth = bodycomp && (width > SBUFSIZ) ? width : SBUFSIZ; + rlwidth = bodycomp && (width > SBUFSIZ) + ? min (width, NMH_BUFSIZ) + : SBUFSIZ; for (i = ncomps; i--; ) *nxtbuf++ = mh_xmalloc(rlwidth); } @@ -160,9 +157,8 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, if (ferror(inb)) { advise("read", "unable to"); /* "read error" */ return SCNFAT; - } else { - return SCNEOF; } + return SCNEOF; } if (outnum) { @@ -218,7 +214,6 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, break; case BODY: - compnum = -1; /* * A slight hack ... if we have less than rlwidth characters * in the buffer, call m_getfld again. @@ -241,7 +236,7 @@ scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg, * The previous code here used to call m_getfld() using * pointers to the underlying output stdio buffers to * avoid the extra copy. Tests by Markus Schnalke show - * no noticable performance loss on larger mailboxes + * no noticeable performance loss on larger mailboxes * if we incur an extra copy, and messing around with * internal stdio buffers is becoming more and more * unportable as times go on. So from now on just deal @@ -325,10 +320,7 @@ finished: if (datecomp) { if (! datecomp->c_text) { if (datecomp->c_tws == NULL) - datecomp->c_tws = (struct tws *) - calloc((size_t) 1, sizeof(*datecomp->c_tws)); - if (datecomp->c_tws == NULL) - adios (NULL, "unable to allocate tws buffer"); + NEW0(datecomp->c_tws); *datecomp->c_tws = *dlocaltime ((time_t *) &st.st_mtime); datecomp->c_flags |= CF_DATEFAB|CF_TRUE; } else {