X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=328db8fc8d28ba6245b36322f459a7fad1e721e5;hp=e778fc312db8b295cdb84047a25c31c474ebe00b;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=943765e7ac5693ae177fd8d2b5a2440e53ce816e diff --git a/uip/mhl.c b/uip/mhl.c index e778fc3..328db8f 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -41,33 +41,27 @@ #define QUOTE '\\' static struct swit mhlswitches[] = { -#define FOLDSW 0 - { "folder +folder", 0 }, -#define FORMSW 1 +#define FORMSW 0 { "form formfile", 0 }, -#define PROGSW 2 - { "moreproc program", 0 }, -#define LENSW 3 - { "length lines", 0 }, -#define WIDTHSW 4 +#define WIDTHSW 1 { "width columns", 0 }, -#define SLEEPSW 5 +#define SLEEPSW 2 { "sleep seconds", 0 }, -#define VERSIONSW 6 - { "version", 0 }, -#define HELPSW 7 +#define VERSIONSW 3 + { "Version", 0 }, +#define HELPSW 4 { "help", 0 }, -#define FORW1SW 8 +#define FORW1SW 5 { "forward", -7 }, -#define FORW2SW 9 +#define FORW2SW 6 { "forwall", -7 }, -#define DGSTSW 10 +#define DGSTSW 7 { "digest list", -6 }, -#define VOLUMSW 11 +#define VOLUMSW 8 { "volume number", -6 }, -#define ISSUESW 12 +#define ISSUESW 9 { "issue number", -5 }, -#define NBODYSW 13 +#define NBODYSW 10 { "nobody", -6 }, { NULL, 0 } }; @@ -93,13 +87,12 @@ struct mcomp { char *c_name; /* component name */ char *c_text; /* component text */ char *c_ovtxt; /* text overflow indicator */ - char *c_nfs; /* iff FORMAT */ + char *c_fstr; /* iff FORMAT */ struct format *c_fmt; /* .. */ int c_offset; /* left margin indentation */ int c_ovoff; /* overflow indentation */ int c_width; /* width of field */ int c_cwidth; /* width of component */ - int c_length; /* length in lines */ long c_flags; struct mcomp *c_next; }; @@ -110,11 +103,11 @@ static struct mcomp *fmthd = NULL; static struct mcomp *fmttl = NULL; static struct mcomp global = { - NULL, NULL, "", NULL, NULL, 0, -1, 80, -1, 40, 0, 0 + NULL, NULL, NULL, NULL, NULL, 0, -1, 80, -1, 0, NULL }; static struct mcomp holder = { - NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, NOCOMPONENT, 0 + NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NOCOMPONENT, NULL }; struct pair { @@ -179,18 +172,12 @@ static int issue = 0; static int exitstat = 0; static int mhldebug = 0; -#define PITTY (-1) -#define NOTTY 0 -static int ontty = NOTTY; - -static int row; -static int column; +static unsigned int column; static int lm; -static int llim; static int ovoff; static int term; -static int wid; +static unsigned int wid; static char *ovtxt; @@ -221,12 +208,12 @@ static FILE *(*mhl_action) () = (FILE *(*) ()) 0; /* ** prototypes */ -static void mhl_format(char *, int, int); +static void mhl_format(char *, int); static int evalvar(struct mcomp *); static int ptoi(char *, int *); static int ptos(char *, char **); static char *parse(void); -static void process(char *, char *, int, int); +static void process(char *, int, int); static void mhlfile(FILE *, char *, int, int); static int mcomp_flags(char *); static char *mcomp_add(long, char *, char *); @@ -238,29 +225,20 @@ static void putcomp(struct mcomp *, struct mcomp *, int); static char *oneline(char *, long); static void putstr(char *); static void putch(char); -static RETSIGTYPE intrser(int); -static RETSIGTYPE pipeser(int); -static RETSIGTYPE quitser(int); +static void intrser(int); static void mhladios(char *, char *, ...); static void mhldone(int); -static void m_popen(char *); - -void m_pclose(void); -int SOprintf(char *, ...); /* from termsbr.c */ int sc_width(void); /* from termsbr.c */ -int sc_length(void); /* from termsbr.c */ int main(int argc, char **argv) { - int length = 0; int i, width = 0, vecp = 0; - char *cp, *folder = NULL, *form = NULL; + char *cp, *form = NULL; char buf[BUFSIZ], *files[MAXARGS]; char **argp, **arguments; - char *progsw = NULL; #ifdef LOCALE setlocale(LC_ALL, ""); @@ -294,11 +272,6 @@ main(int argc, char **argv) print_version(invo_name); done(1); - case FOLDSW: - if (!(folder = *argp++) || *folder == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios(NULL, "missing argument to %s", @@ -312,20 +285,6 @@ main(int argc, char **argv) sleepsw = atoi(cp); /* ZERO ok! */ continue; - case PROGSW: - if (!(progsw = *argp++) || *progsw == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - continue; - - case LENSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - if ((length = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", - argp[-2], cp); - continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios(NULL, "missing argument to %s", @@ -372,28 +331,13 @@ main(int argc, char **argv) files[vecp++] = cp; } - if (!folder) - folder = getenv("mhfolder"); - - if (isatty(fileno(stdout))) { - if (mhl_action) { - SIGNAL(SIGINT, SIG_IGN); - SIGNAL2(SIGQUIT, quitser); - } - SIGNAL2(SIGPIPE, pipeser); - m_popen(progsw ? progsw : moreproc); - ontty = PITTY; - } else { - ontty = NOTTY; - } - - mhl_format(form ? form : mhlformat, length, width); + mhl_format(form ? form : mhlformat, width); if (vecp == 0) { - process(folder, NULL, 1, vecp = 1); + process(NULL, 1, vecp = 1); } else { for (i = 0; i < vecp; i++) - process(folder, files[i], i + 1, vecp); + process(files[i], i + 1, vecp); } if (forwall) { @@ -421,18 +365,15 @@ main(int argc, char **argv) adios("output", "error writing"); } - if (ontty == PITTY) - m_pclose(); - return exitstat; } static void -mhl_format(char *file, int length, int width) +mhl_format(char *file, int width) { int i; - char *bp, *cp, **ip; + char *bp, *cp; char *ap, buffer[BUFSIZ], name[NAMESZ]; struct mcomp *c1; struct stat st; @@ -460,17 +401,15 @@ mhl_format(char *file, int length, int width) ino = st.st_ino; } - global.c_ovtxt = global.c_nfs = NULL; + global.c_ovtxt = global.c_fstr = NULL; global.c_fmt = NULL; global.c_offset = 0; global.c_ovoff = -1; if ((i = sc_width()) > 5) global.c_width = i; global.c_cwidth = -1; - if ((i = sc_length()) > 5) - global.c_length = i - 1; global.c_flags = 0; - *(ip = ignores) = NULL; + *ignores = NULL; while (vfgets(fp, &ap) == OK) { bp = ap; @@ -497,25 +436,20 @@ mhl_format(char *file, int length, int width) ** it to the end of the current "ignores" list. */ if (!mh_strcasecmp(name, "ignores")) { - char **tmparray, **p; + char **tmparray; int n = 0; /* split the fields */ tmparray = brkstring(getcpy(++parptr), ",", NULL); - - /* count number of fields split */ - p = tmparray; - while (*p++) - n++; - /* ** copy pointers to split fields ** to ignores array */ - ip = copyip(tmparray, ip, - MAXARGS - num_ignores); - num_ignores += n; + while (tmparray[n] && num_ignoresc_nfs && global.c_nfs) { + if (!c1->c_fstr && global.c_fstr) { if ((c1->c_flags & DATEFMT) && (global.c_flags & DATEFMT)) { - c1->c_nfs = getcpy(global.c_nfs); + c1->c_fstr = getcpy(global.c_fstr); } else if ((c1->c_flags & ADDRFMT) && (global.c_flags & ADDRFMT)) { - c1->c_nfs = getcpy(global.c_nfs); + c1->c_fstr = getcpy(global.c_fstr); } } continue; @@ -554,19 +488,15 @@ mhl_format(char *file, int length, int width) if (mhldebug) { for (c1 = fmthd; c1; c1 = c1->c_next) { fprintf(stderr, "c1: name=\"%s\" text=\"%s\" ovtxt=\"%s\"\n", c1->c_name, c1->c_text, c1->c_ovtxt); - fprintf(stderr, "\tnfs=0x%x fmt=0x%x\n", (unsigned int)(unsigned long) c1->c_nfs, (unsigned int)(unsigned long) c1->c_fmt); - fprintf(stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d length=%d\n", c1->c_offset, c1->c_ovoff, c1->c_width, c1->c_cwidth, c1->c_length); + fprintf(stderr, "\tfstr=0x%x fmt=0x%x\n", (unsigned int)(unsigned long) c1->c_fstr, (unsigned int)(unsigned long) c1->c_fmt); + fprintf(stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d\n", c1->c_offset, c1->c_ovoff, c1->c_width, c1->c_cwidth); fprintf (stderr, "\tflags=%s\n", snprintb(buffer, sizeof(buffer), (unsigned) c1->c_flags, LBITS)); } } out: - if (length) - global.c_length = length; if (width) global.c_width = width; - if (global.c_length < 5) - global.c_length = 10000; if (global.c_width < 5) global.c_width = 10000; } @@ -593,23 +523,23 @@ evalvar(struct mcomp *c1) return ptos(name, &c1->c_ovtxt); if (!mh_strcasecmp(name, "formatfield")) { - char *nfs; + char *fmtstr; if (ptos(name, &cp)) return 1; cp = concat("=", cp, NULL); - nfs = new_fs(cp, NULL); + fmtstr = new_fs(cp, NULL); free(cp); - c1->c_nfs = getcpy(nfs); + c1->c_fstr = getcpy(fmtstr); c1->c_flags |= FORMAT; return 0; } if (!mh_strcasecmp(name, "decode")) { - char *nfs; + char *fmtstr; - nfs = new_fs("=%(decode{text})", NULL); - c1->c_nfs = getcpy(nfs); + fmtstr = new_fs("=%(decode{text})", NULL); + c1->c_fstr = getcpy(fmtstr); c1->c_flags |= FORMAT; return 0; } @@ -622,8 +552,6 @@ evalvar(struct mcomp *c1) return ptoi(name, &c1->c_width); if (!mh_strcasecmp(name, "compwidth")) return ptoi(name, &c1->c_cwidth); - if (!mh_strcasecmp(name, "length")) - return ptoi(name, &c1->c_length); for (ap = triples; ap->t_name; ap++) if (!mh_strcasecmp(ap->t_name, name)) { @@ -706,9 +634,8 @@ parse(void) static void -process(char *folder, char *fname, int ofilen, int ofilec) +process(char *fname, int ofilen, int ofilec) { - char *cp = NULL; FILE *fp = NULL; struct mcomp *c1; @@ -726,17 +653,13 @@ process(char *folder, char *fname, int ofilen, int ofilec) fname = "(stdin)"; fp = stdin; } - cp = folder ? concat(folder, ":", fname, NULL) : getcpy(fname); - if (ontty != PITTY) - SIGNAL(SIGINT, intrser); - mhlfile(fp, cp, ofilen, ofilec); + SIGNAL(SIGINT, intrser); + mhlfile(fp, fname, ofilen, ofilec); /* FALL THROUGH! */ default: - if (ontty != PITTY) - SIGNAL(SIGINT, SIG_IGN); + SIGNAL(SIGINT, SIG_IGN); if (mhl_action == NULL && fp != stdin) fclose(fp); - free(cp); if (holder.c_text) { free(holder.c_text); holder.c_text = NULL; @@ -812,7 +735,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) case BODY: case FILEEOF: - row = column = 0; + column = 0; for (c1 = fmthd; c1; c1 = c1->c_next) { if (c1->c_flags & CLEARTEXT) { putcomp(c1, c1, ONECOMP); @@ -919,7 +842,7 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) dat[2] = 0; dat[3] = sizeof(buffer) - 1; dat[4] = 0; - fmt_compile(c1->c_nfs, &c1->c_fmt); + fmt_compile(c1->c_fstr, &c1->c_fmt); if (!(c1->c_flags & ADDRFMT)) { FINDCOMP(cptr, "text"); @@ -1000,7 +923,7 @@ add_queue(struct mcomp **head, struct mcomp **tail, char *name, c1->c_ovtxt = getcpy(global.c_ovtxt); c1->c_offset = global.c_offset; c1->c_ovoff = global. c_ovoff; - c1->c_width = c1->c_length = 0; + c1->c_width = 0; c1->c_cwidth = global.c_cwidth; c1->c_flags |= global.c_flags & GFLAGS; } @@ -1027,8 +950,8 @@ free_queue(struct mcomp **head, struct mcomp **tail) free(c1->c_text); if (c1->c_ovtxt) free(c1->c_ovtxt); - if (c1->c_nfs) - free(c1->c_nfs); + if (c1->c_fstr) + free(c1->c_fstr); if (c1->c_fmt) free((char *) c1->c_fmt); free((char *) c1); @@ -1046,7 +969,6 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) cchdr = 0; lm = 0; - llim = c1->c_length ? c1->c_length : -1; wid = c1->c_width ? c1->c_width : global.c_width; ovoff = (c1->c_ovoff >= 0 ? c1->c_ovoff : global.c_ovoff) + c1->c_offset; @@ -1062,7 +984,7 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) return; } - if (c1->c_nfs && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT))) + if (c1->c_fstr && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT))) mcomp_format(c1, c2); if (c1->c_flags & CENTER) { @@ -1121,11 +1043,11 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) count = 0; if (cchdr) { if (flag == TWOCOMP) - count = (c1->c_cwidth >= 0) ? - c1->c_cwidth : strlen(c2->c_name) + 2; + count = (c1->c_cwidth >= 0) ? c1->c_cwidth : + (int)strlen(c2->c_name) + 2; else - count = (c1->c_cwidth >= 0) ? - c1->c_cwidth : strlen(c1->c_text ? + count = (c1->c_cwidth >= 0) ? (size_t)c1->c_cwidth : + strlen(c1->c_text ? c1->c_text : c1->c_name) + 2; } count += c1->c_offset; @@ -1220,30 +1142,7 @@ putstr(char *string) static void putch(char ch) { - char buf[BUFSIZ]; - - if (llim == 0) - return; - switch (ch) { - case '\n': - if (llim > 0) - llim--; - column = 0; - row++; - if (row != global.c_length) - break; - fflush(stdout); - buf[0] = 0; - read(fileno(stdout), buf, sizeof(buf)); - if (strchr(buf, '\n')) { - row = 0; - } else { - putchar('\n'); - row = global.c_length / 3; - } - return; - case '\t': column |= 07; column++; @@ -1253,6 +1152,7 @@ putch(char ch) column--; break; + case '\n': case '\r': column = 0; break; @@ -1284,43 +1184,15 @@ putch(char ch) } -static RETSIGTYPE +static void intrser(int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL(SIGINT, intrser); -#endif - discard(stdout); putchar('\n'); longjmp(env, DONE); } -static RETSIGTYPE -pipeser(int i) -{ -#ifndef RELIABLE_SIGNALS - SIGNAL(SIGPIPE, pipeser); -#endif - - done(NOTOK); -} - - -static RETSIGTYPE -quitser(int i) -{ -#ifndef RELIABLE_SIGNALS - SIGNAL(SIGQUIT, quitser); -#endif - - putchar('\n'); - fflush(stdout); - done(NOTOK); -} - - #undef adios #undef done @@ -1345,68 +1217,3 @@ mhldone(int status) else done(exitstat); } - - -static int m_pid = NOTOK; -static int sd = NOTOK; - -static void -m_popen(char *name) -{ - int pd[2]; - - if (mhl_action && (sd = dup(fileno(stdout))) == NOTOK) - adios("standard output", "unable to dup()"); - - if (pipe(pd) == NOTOK) - adios("pipe", "unable to"); - - switch (m_pid = fork()) { - case NOTOK: - adios("fork", "unable to"); - - case OK: - SIGNAL(SIGINT, SIG_DFL); - SIGNAL(SIGQUIT, SIG_DFL); - - close(pd[1]); - if (pd[0] != fileno(stdin)) { - dup2(pd[0], fileno(stdin)); - close(pd[0]); - } - execlp(name, mhbasename(name), NULL); - fprintf(stderr, "unable to exec "); - perror(name); - _exit(-1); - - default: - close(pd[0]); - if (pd[1] != fileno(stdout)) { - dup2(pd[1], fileno(stdout)); - close(pd[1]); - } - } -} - - -void -m_pclose(void) -{ - if (m_pid == NOTOK) - return; - - if (sd != NOTOK) { - fflush(stdout); - if (dup2(sd, fileno(stdout)) == NOTOK) - adios("standard output", "unable to dup2()"); - - clearerr(stdout); - close(sd); - sd = NOTOK; - } - else - fclose(stdout); - - pidwait(m_pid, OK); - m_pid = NOTOK; -}