📄 mhlsbr.c
字号:
case 1: global.c_flags |= BELL; break; case -1: global.c_flags &= ~BELL; break; } 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;}/* */static evalvar (c1)register struct mcomp *c1;{ char *cp, name[NAMESZ]; register struct triple *ap; if (!*parptr) return 0; (void) strcpy (name, parse ()); if (uleq (name, "component")) { if (ptos (name, &c1 -> c_text)) return 1; c1 -> c_flags &= ~NOCOMPONENT; return 0; } if (uleq (name, "overflowtext")) return ptos (name, &c1 -> c_ovtxt); if (uleq (name, "formatfield")) { if (ptos (name, &cp)) return 1; c1 -> c_nfs = getcpy (new_fs (NULLCP, NULLCP, cp)); c1 -> c_flags |= FORMAT; return 0; } if (uleq (name, "offset")) return ptoi (name, &c1 -> c_offset); if (uleq (name, "overflowoffset")) return ptoi (name, &c1 -> c_ovoff); if (uleq (name, "width")) return ptoi (name, &c1 -> c_width); if (uleq (name, "compwidth")) return ptoi (name, &c1 -> c_cwidth); if (uleq (name, "length")) return ptoi (name, &c1 -> c_length); for (ap = triples; ap -> t_name; ap++) if (uleq (ap -> t_name, name)) { c1 -> c_flags |= ap -> t_on; c1 -> c_flags &= ~ap -> t_off; return 0; } return 1;}/* */static int ptoi (name, i)register char *name;register int *i;{ char *cp; if (*parptr++ != '=' || !*(cp = parse ())) { advise (NULLCP, "missing argument to variable %s", name); return 1; } *i = atoi (cp); return 0;}static int ptos (name, s)register char *name, **s;{ char c, *cp; if (*parptr++ != '=') { advise (NULLCP, "missing argument to variable %s", name); return 1; } if (*parptr != '"') for (cp = parptr; *parptr && *parptr != ':' && *parptr != ','; parptr++) continue; else for (cp = ++parptr; *parptr && *parptr != '"'; parptr++) if (*parptr == QUOTE) if (!*++parptr) parptr--; c = *parptr; *parptr = NULL; *s = getcpy (cp); if ((*parptr = c) == '"') parptr++; return 0;}/* */static char *parse () { int c; register char *cp; static char result[NAMESZ]; for (cp = result; c = *parptr; parptr++) if (isalnum (c) || c == '.' || c == '-' || c == '_' || c =='[' || c == ']') *cp++ = c; else break; *cp = NULL; return result;}/* */static process (folder, fname, ofilen, ofilec)char *folder, *fname;int ofilen, ofilec;{ char *cp; FILE *fp; struct mcomp *c1; switch (setjmp (env)) { case OK: if (fname) { fp = mhl_action ? (*mhl_action) (fname) : fopen (fname, "r"); if (fp == NULL) { advise (fname, "unable to open"); exitstat++; return; } } else { fname = "(stdin)"; fp = stdin; } cp = folder ? concat (folder, ":", fname, NULLCP) : getcpy (fname); if (ontty != PITTY) (void) signal (SIGINT, intrser); mhlfile (fp, cp, ofilen, ofilec);/* fall */ default: if (ontty != PITTY) (void) signal (SIGINT, SIG_IGN); if (mhl_action == NULL && fp != stdin) (void) fclose (fp); free (cp); if (holder.c_text) { free (holder.c_text); holder.c_text = NULL; } free_queue (&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1 -> c_next) c1 -> c_flags &= ~HDROUTPUT; break; }}/* */static mhlfile (fp, mname, ofilen, ofilec)register FILE *fp;register char *mname;int ofilen, ofilec;{ int state; register struct mcomp *c1, *c2, *c3; register char **ip; char name[NAMESZ], buf[BUFSIZ]; if (forwall) { if (digest) printf ("%s", ofilen == 1 ? delim3 : delim4); else { printf ("\n-------"); if (ofilen == 1) printf (" Forwarded Message%s", ofilec > 1 ? "s" : ""); else printf (" Message %d", ofilen); printf ("\n\n"); } } else switch (ontty) { case PITTY: if (ofilec > 1) { if (ofilen > 1) { if ((global.c_flags & CLEARSCR)) clear_screen (); else printf ("\n\n\n"); } printf (">>> %s\n\n", mname); } break; case ISTTY: (void) strcpy (buf, "\n"); if (ofilec > 1) { if (SOprintf ("Press <return> to list \"%s\"...", mname)) { if (ofilen > 1) printf ("\n\n\n"); printf ("Press <return> to list \"%s\"...", mname); } (void) fflush (stdout); buf[0] = NULL; (void) read (fileno (stdout), buf, sizeof buf); } if (index (buf, '\n')) { if ((global.c_flags & CLEARSCR)) clear_screen (); } else printf ("\n"); break; default: if (ofilec > 1) { if (ofilen > 1) { printf ("\n\n\n"); if (clearflg > 0) clear_screen (); } printf (">>> %s\n\n", mname); } break; }/* */ for (state = FLD;;) switch (state = m_getfld (state, name, buf, sizeof buf, fp)) { case FLD: case FLDPLUS: for (ip = ignores; *ip; ip++) if (uleq (name, *ip)) { while (state == FLDPLUS) state = m_getfld (state, name, buf, sizeof buf, fp); break; } if (*ip) continue; for (c2 = fmthd; c2; c2 = c2 -> c_next) if (uleq (c2 -> c_name, name)) break; c1 = NULL; if (!((c3 = c2 ? c2 : &global) -> c_flags & SPLIT)) for (c1 = msghd; c1; c1 = c1 -> c_next) if (uleq (c1 -> c_name, c3 -> c_name)) { c1 -> c_text = mcomp_add (c1 -> c_flags, buf, c1 -> c_text); break; } if (c1 == NULL) c1 = add_queue (&msghd, &msgtl, name, buf, 0); while (state == FLDPLUS) { state = m_getfld (state, name, buf, sizeof buf, fp); c1 -> c_text = add (buf, c1 -> c_text); } if (c2 == NULL) c1 -> c_flags |= EXTRA; continue; case BODY: case FILEEOF: row = column = 0; for (c1 = fmthd; c1; c1 = c1 -> c_next) { if (c1 -> c_flags & CLEARTEXT) { putcomp (c1, c1, ONECOMP); continue; } if (uleq (c1 -> c_name, "messagename")) { holder.c_text = concat ("(Message ", mname, ")\n", NULLCP); putcomp (c1, &holder, ONECOMP); free (holder.c_text); holder.c_text = NULL; continue; } if (uleq (c1 -> c_name, "extras")) { for (c2 = msghd; c2; c2 = c2 -> c_next) if (c2 -> c_flags & EXTRA) putcomp (c1, c2, TWOCOMP); continue; } if (uleq (c1 -> c_name, "body")) { if ((holder.c_text = malloc (sizeof buf)) == NULL) adios (NULLCP, "unable to allocate buffer memory"); (void) strcpy (holder.c_text, buf); while (state == BODY) { putcomp (c1, &holder, BODYCOMP); state = m_getfld (state, name, holder.c_text, sizeof buf, fp); } free (holder.c_text); holder.c_text = NULL; continue; } for (c2 = msghd; c2; c2 = c2 -> c_next) if (uleq (c2 -> c_name, c1 -> c_name)) { putcomp (c1, c2, ONECOMP); if (!(c1 -> c_flags & SPLIT)) break; } if (faceproc && c2 == NULL && (c1 -> c_flags & FACEFMT)) for (c2 = msghd; c2; c2 = c2 -> c_next) if (c2 -> c_flags & FACEDFLT) { if (c2 -> c_face == NULL) face_format (c2); if (holder.c_text = c2 -> c_face) { putcomp (c1, &holder, ONECOMP); holder.c_text = NULL; } break; } } return; case LENERR: case FMTERR: advise (NULLCP, "format error in message %s", mname); exitstat++; return; default: adios (NULLCP, "getfld() returned %d", state); }}/* */static int mcomp_flags (name)register char *name;{ register struct pair *ap; for (ap = pairs; ap -> p_name; ap++) if (uleq (ap -> p_name, name)) return (ap -> p_flags); return NULL;}static char *mcomp_add (flags, s1, s2)long flags;register char *s1, *s2;{ register char *dp; if (!(flags & ADDRFMT)) return add (s1, s2); if (s2 && *(dp = s2 + strlen (s2) - 1) == '\n') *dp = NULL; return add (s1, add (",\n", s2));}/* */struct pqpair { char *pq_text; char *pq_error; struct pqpair *pq_next;};static mcomp_format (c1, c2)register struct mcomp *c1, *c2;{ int dat[4]; register char *ap, *cp; char buffer[BUFSIZ], error[BUFSIZ]; register struct comp *cptr; register struct pqpair *p, *q; struct pqpair pq; register struct mailname *mp; ap = c2 -> c_text; c2 -> c_text = NULL; dat[0] = dat[1] = dat[2] = 0; dat[3] = sizeof buffer - 1; (void) fmt_compile (c1 -> c_nfs, &c1 -> c_fmt); if (!(c1 -> c_flags & ADDRFMT)) { FINDCOMP (cptr, "text"); if (cptr) cptr -> c_text = ap; (void) fmtscan (c1 -> c_fmt, buffer, sizeof buffer - 1, dat); /* Don't need to append a newline, dctime() already did */ c2 -> c_text = getcpy (buffer); free (ap); return; } (q = &pq) -> pq_next = NULL; while (cp = getname (ap)) { if ((p = (struct pqpair *) calloc ((unsigned) 1, sizeof *p)) == NULL) adios (NULLCP, "unable to allocate pqpair memory"); if ((mp = getm (cp, NULLCP, 0, AD_NAME, error)) == NULL) { p -> pq_text = getcpy (cp); p -> pq_error = getcpy (error); } else { if ((c1 -> c_flags & FACEDFLT) && c2 -> c_face == NULL) { char *h, *o; if ((h = mp -> m_host) == NULL) h = LocalName (); if (o = OfficialName (h)) h = o; c2 -> c_face = concat ("address ", h, " ", mp -> m_mbox, NULLCP); } p -> pq_text = getcpy (mp -> m_text); mnfree (mp); } q = (q -> pq_next = p); } for (p = pq.pq_next; p; p = q) { FINDCOMP (cptr, "text"); if (cptr) cptr -> c_text = p -> pq_text; FINDCOMP (cptr, "error"); if (cptr) cptr -> c_text = p -> pq_error; (void) fmtscan (c1 -> c_fmt, buffer, sizeof buffer - 1, dat); if (*buffer) { if (c2 -> c_text) c2 -> c_text = add (",\n", c2 -> c_text); if (*(cp = buffer + strlen (buffer) - 1) == '\n') *cp = NULL; c2 -> c_text = add (buffer, c2 -> c_text); } free (p -> pq_text); if (p -> pq_error) free (p -> pq_error); q = p -> pq_next; free ((char *) p); } c2 -> c_text = add ("\n", c2 -> c_text); free (ap);}/* */static struct mcomp *add_queue (head, tail, name, text, flags)register struct mcomp **head, **tail;register char *name, *text;int flags;{ register struct mcomp *c1; if ((c1 = (struct mcomp *) calloc ((unsigned) 1, sizeof *c1)) == NULL) adios (NULLCP, "unable to allocate comp memory"); c1 -> c_flags = flags & ~INIT; if (c1 -> c_name = name ? getcpy (name) : NULL) c1 -> c_flags |= mcomp_flags (c1 -> c_name); c1 -> c_text = text ? getcpy (text) : NULL; if (flags & INIT) { if (global.c_ovtxt) 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_cwidth = global.c_cwidth; c1 -> c_flags |= global.c_flags & GFLAGS; } if (*head == NULL) *head = c1; if (*tail != NULL) (*tail) -> c_next = c1; *tail = c1; return c1;}static free_queue (head, tail)register struct mcomp **head, **tail;{ register struct mcomp *c1, *c2; for (c1 = *head; c1; c1 = c2) { c2 = c1 -> c_next; if (c1 -> c_name) free (c1 -> c_name); if (c1 -> c_text) free (c1 -> c_text); if (c1 -> c_ovtxt) free (c1 -> c_ovtxt); if (c1 -> c_nfs) free (c1 -> c_nfs); if (c1 -> c_fmt) free ((char *) c1 -> c_fmt); if (c1 -> c_face) free (c1 -> c_face); free ((char *) c1); } *head = *tail = NULL;}/* */static putcomp (c1, c2, flag)register struct mcomp *c1, *c2;int flag;{ int count, cchdr; register char *cp; 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; if ((ovtxt = c1 -> c_ovtxt ? c1 -> c_ovtxt : global.c_ovtxt) == NULL) ovtxt = ""; if (wid < ovoff + strlen (ovtxt) + 5) adios (NULLCP, "component: %s width(%d) too small for overflow(%d)", c1 -> c_name, wid, ovoff + strlen (ovtxt) + 5); onelp = NULL; if (c1 -> c_flags & CLEARTEXT) { putstr (c1 -> c_text); putstr ("\n"); return; } if (c1 -> c_flags & FACEFMT) switch (doface (c2)) { case NOTOK: /* error */ case OK: /* async faceproc */ return; default: /* sync faceproc */ break; } if (c1 -> c_nfs && (c1 -> c_flags & (ADDRFMT | DATEFMT | FORMAT))) mcomp_format (c1, c2); if (c1 -> c_flags & CENTER) { count = (c1 -> c_width ? c1 -> c_width : global.c_width) - c1 -> c_offset - strlen (c2 -> c_text); if (!(c1 -> c_flags & HDROUTPUT) && !(c1 -> c_flags & NOCOMPONENT)) count -= strlen (c1 -> c_text ? c1 -> c_text : c1 -> c_name) + 2; lm = c1 -> c_offset + (count / 2); } else if (c1 -> c_offset) lm = c1 -> c_offset;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -