X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/dbdc79c387af1820ee5f4bf669b337becde83357..e98c2d0fee3d656633ae897576b3d8d0f0fddfe2:/uip/mhlsbr.c diff --git a/uip/mhlsbr.c b/uip/mhlsbr.c index 421098cb..e0759334 100644 --- a/uip/mhlsbr.c +++ b/uip/mhlsbr.c @@ -44,55 +44,38 @@ #define QUOTE '\\' -static struct swit mhlswitches[] = { -#define BELLSW 0 - { "bell", 0 }, -#define NBELLSW 1 - { "nobell", 0 }, -#define CLRSW 2 - { "clear", 0 }, -#define NCLRSW 3 - { "noclear", 0 }, -#define FOLDSW 4 - { "folder +folder", 0 }, -#define FORMSW 5 - { "form formfile", 0 }, -#define PROGSW 6 - { "moreproc program", 0 }, -#define NPROGSW 7 - { "nomoreproc", 0 }, -#define LENSW 8 - { "length lines", 0 }, -#define WIDTHSW 9 - { "width columns", 0 }, -#define SLEEPSW 10 - { "sleep seconds", 0 }, -#define BITSTUFFSW 11 - { "dashstuffing", -12 }, /* interface from forw */ -#define NBITSTUFFSW 12 - { "nodashstuffing", -14 }, /* interface from forw */ -#define VERSIONSW 13 - { "version", 0 }, -#define HELPSW 14 - { "help", 0 }, -#define FORW1SW 15 - { "forward", -7 }, /* interface from forw */ -#define FORW2SW 16 - { "forwall", -7 }, /* interface from forw */ -#define DGSTSW 17 - { "digest list", -6 }, -#define VOLUMSW 18 - { "volume number", -6 }, -#define ISSUESW 19 - { "issue number", -5 }, -#define NBODYSW 20 - { "nobody", -6 }, -#define FMTPROCSW 21 - { "fmtproc program", 0 }, -#define NFMTPROCSW 22 - { "nofmtproc", 0 }, - { NULL, 0 } -}; +#define MHL_SWITCHES \ + X("bell", 0, BELLSW) \ + X("nobell", 0, NBELLSW) \ + X("clear", 0, CLRSW) \ + X("noclear", 0, NCLRSW) \ + X("folder +folder", 0, FOLDSW) \ + X("form formfile", 0, FORMSW) \ + X("moreproc program", 0, PROGSW) \ + X("nomoreproc", 0, NPROGSW) \ + X("length lines", 0, LENSW) \ + X("width columns", 0, WIDTHSW) \ + X("sleep seconds", 0, SLEEPSW) \ + X("dashstuffing", -12, BITSTUFFSW) /* interface from forw */ \ + X("nodashstuffing", -14, NBITSTUFFSW) /* interface from forw */ \ + X("version", 0, VERSIONSW) \ + X("help", 0, HELPSW) \ + X("forward", -7, FORW1SW) /* interface from forw */ \ + X("forwall", -7, FORW2SW) /* interface from forw */ \ + X("digest list", -6, DGSTSW) \ + X("volume number", -6, VOLUMSW) \ + X("issue number", -5, ISSUESW) \ + X("nobody", -6, NBODYSW) \ + X("fmtproc program", 0, FMTPROCSW) \ + X("nofmtproc", 0, NFMTPROCSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(MHL); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(MHL, mhlswitches); +#undef X #define NOCOMPONENT 0x000001 /* don't show component name */ #define UPPERCASE 0x000002 /* display in all upper case */ @@ -895,6 +878,7 @@ process (char *folder, char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; struct stat st; + struct arglist *ap; switch (setjmp (env)) { case OK: @@ -919,6 +903,14 @@ process (char *folder, char *fname, int ofilen, int ofilec) SIGNAL (SIGINT, intrser); mhlfile (fp, cp, ofilen, ofilec); /* FALL THROUGH! */ + for (ap = arglist_head; ap; ap = ap->a_next) { + fmt_free(ap->a_fmt, 0); + ap->a_fmt = NULL; + } + + if (arglist_head) + fmt_free(NULL, 1); + default: if (ontty != PITTY) SIGNAL (SIGINT, SIG_IGN); @@ -1009,7 +1001,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec) switch (state = m_getfld (state, name, buf, sizeof(buf), fp)) { case FLD: case FLDPLUS: - bucket = fmt_addcomp(name, buf); + bucket = fmt_addcomptext(name, buf); for (ip = ignores; *ip; ip++) if (!mh_strcasecmp (name, *ip)) { while (state == FLDPLUS) { @@ -1159,7 +1151,7 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2) if (!(c1->c_flags & ADDRFMT)) { if (c1->c_c_text) - c1->c_c_text->c_text = getcpy (ap); + c1->c_c_text->c_text = ap; if ((cp = strrchr(ap, '\n'))) /* drop ending newline */ if (!cp[1]) *cp = 0; @@ -1168,7 +1160,7 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2) /* Don't need to append a newline, dctime() already did */ c2->c_text = getcpy (buffer); - free (ap); + /* ap is now owned by the component struct, so do NOT free it here */ return; } @@ -1566,6 +1558,7 @@ mhlsbr (int argc, char **argv, FILE *(*action)()) SIGNAL_HANDLER istat = NULL, pstat = NULL, qstat = NULL; char *cp = NULL; struct mcomp *c1; + struct arglist *a, *a2; switch (setjmp (mhlenv)) { case OK: @@ -1602,6 +1595,15 @@ mhlsbr (int argc, char **argv, FILE *(*action)()) free_queue (&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1->c_next) c1->c_flags &= ~HDROUTPUT; + + a = arglist_head; + while (a) { + if (a->a_nfs) + free(a->a_nfs); + a2 = a->a_next; + free(a); + a = a2; + } return exitstat; } }