📄 mshcmds.c
字号:
"inplace", 0,#define RENINSW 13 "noinplace", 0,#define REQUSW 14 "query", 0,#define RENQUSW 15 "noquery", 0,#define REWHTSW 16 "whatnowproc program", 0,#define RENWTSW 17 "nowhatnow", 0,#define REWIDSW 19 "width columns", 0,#define REHELP 20 "help", 4, NULL, 0};/* */replcmd (args)char **args;{ int vecp = 1; char *cp, *msg = NULL, buf[BUFSIZ], *vec[MAXARGS]; if (fmsh) { forkcmd (args, cmd_name); return; } while (cp = *args++) { if (*cp == '-') switch (smatch (++cp, replswit)) { case AMBIGSW: ambigsw (cp, replswit); return; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); return; case REHELP: (void) sprintf (buf, "%s [msgs] [switches]", cmd_name); help (buf, replswit); return; case REANSW: /* not implemented */ case RENANSW: case REINSW: case RENINSW: continue; case REQUSW: case RENQUSW: case RENDFSW: case RENEDSW: case RENWTSW: vec[vecp++] = --cp; continue; case RECCSW: case RENCCSW: case REEDTSW: case REFCCSW: case REFLTSW: case REFRMSW: case REWIDSW: case REDFSW: case REDMSW: case REWHTSW: vec[vecp++] = --cp; if (!(cp = *args++) || *cp == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } vec[vecp++] = cp; continue; } if (*cp == '+' || *cp == '@') { advise (NULLCP, "sorry, no folders allowed!"); return; } else if (msg) { advise (NULLCP, "only one message at a time!"); return; } else msg = cp; } vec[0] = cmd_name; vec[vecp++] = "-file"; vec[vecp] = NULL; if (!msg) msg = "cur"; if (!m_convert (mp, msg)) return; m_setseq (mp); if (mp -> numsel > 1) { advise (NULLCP, "only one message at a time!"); return; } (void) process (mp -> hghsel, cmd_name, vecp, vec); m_setcur (mp, mp -> hghsel);}/* */static struct swit rmmswit[] = {#define RMHELP 0 "help", 4, NULL, 0};/* */rmmcmd (args)char **args;{ int msgp = 0, msgnum; char *cp, buf[BUFSIZ], *msgs[MAXARGS]; while (cp = *args++) { if (*cp == '-') switch (smatch (++cp, rmmswit)) { case AMBIGSW: ambigsw (cp, rmmswit); return; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); return; case RMHELP: (void) sprintf (buf, "%s [msgs] [switches]", cmd_name); help (buf, rmmswit); return; } if (*cp == '+' || *cp == '@') { advise (NULLCP, "sorry, no folders allowed!"); return; } else msgs[msgp++] = cp; } if (!msgp) msgs[msgp++] = "cur"; for (msgnum = 0; msgnum < msgp; msgnum++) if (!m_convert (mp, msgs[msgnum])) return; m_setseq (mp); rmm ();}/* */static rmm () { register int msgnum, vecp; register char *cp; char buffer[BUFSIZ], *vec[MAXARGS]; if (fmsh) { if (rmmproc) { if (mp -> numsel > MAXARGS - 1) { advise (NULLCP, "more than %d messages for %s exec", MAXARGS - 1, rmmproc); return; } vecp = 0; for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) if (mp -> msgstats[msgnum] & SELECTED) vec[vecp++] = getcpy (m_name (msgnum)); vec[vecp] = NULL; forkcmd (vec, rmmproc); for (vecp = 0; vec[vecp]; vecp++) free (vec[vecp]); } else for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) if (mp -> msgstats[msgnum] & SELECTED) { (void) strcpy (buffer, m_backup (cp = m_name (msgnum))); if (rename (cp, buffer) == NOTOK) admonish (buffer, "unable to rename %s to", cp); } } for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) if (mp -> msgstats[msgnum] & SELECTED) { mp -> msgstats[msgnum] |= DELETED; mp -> msgstats[msgnum] &= ~EXISTS;#ifdef MPOP#ifdef BPOP if (pmsh && pop_dele (msgnum) != OK) fprintf (stderr, "%s", response);#endif#endif /* MPOP */ } if ((mp -> nummsg -= mp -> numsel) <= 0) { if (fmsh) admonish (NULLCP, "no messages remaining in +%s", fmsh); else admonish (NULLCP, "no messages remaining in %s", mp -> foldpath); mp -> lowmsg = mp -> hghmsg = mp -> nummsg = 0; } if (mp -> lowsel == mp -> lowmsg) { for (msgnum = mp -> lowmsg + 1; msgnum <= mp -> hghmsg; msgnum++) if (mp -> msgstats[msgnum] & EXISTS) break; mp -> lowmsg = msgnum; } if (mp -> hghsel == mp -> hghmsg) { for (msgnum = mp -> hghmsg - 1; msgnum >= mp -> lowmsg; msgnum--) if (mp -> msgstats[msgnum] & EXISTS) break; mp -> hghmsg = msgnum; } mp -> msgflags |= MODIFIED; modified++;}/* */static struct swit scanswit[] = {#define SCCLR 0 "clear", 0,#define SCNCLR 1 "noclear", 0,#define SCFORM 2 "form formatfile", 0,#define SCFMT 3 "format string", 5,#define SCHEAD 4 "header", 0,#define SCNHEAD 5 "noheader", 0,#define SCWID 6 "width columns", 0,#define SCHELP 7 "help", 4, NULL, 0};/* */scancmd (args)char **args;{#define equiv(a,b) (a ? b && !strcmp (a, b) : !b) int clearsw = 0, headersw = 0, width = 0, msgp = 0, msgnum, optim, state; char *cp, *form = NULL, *format = NULL, buf[BUFSIZ], *nfs, *msgs[MAXARGS]; register FILE *zp;#ifdef MPOP#ifdef BPOP static int p_optim = 0;#endif#endif /* MPOP */ static int s_optim = 0; static char *s_form = NULL, *s_format = NULL; while (cp = *args++) { if (*cp == '-') switch (smatch (++cp, scanswit)) { case AMBIGSW: ambigsw (cp, scanswit); return; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); return; case SCHELP: (void) sprintf (buf, "%s [msgs] [switches]", cmd_name); help (buf, scanswit); return; case SCCLR: clearsw++; continue; case SCNCLR: clearsw = 0; continue; case SCHEAD: headersw++; continue; case SCNHEAD: headersw = 0; continue; case SCFORM: if (!(form = *args++) || *form == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } format = NULL; continue; case SCFMT: if (!(format = *args++) || *format == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } form = NULL; continue; case SCWID: if (!(cp = *args++) || *cp == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } width = atoi (cp); continue; } if (*cp == '+' || *cp == '@') { advise (NULLCP, "sorry, no folders allowed!"); return; } else msgs[msgp++] = cp; } if (!msgp) msgs[msgp++] = "all"; for (msgnum = 0; msgnum < msgp; msgnum++) if (!m_convert (mp, msgs[msgnum])) return; m_setseq (mp); nfs = new_fs (form, format, FORMAT); if (scanl) { /* force scansbr to (re)compile format */ (void) free (scanl); scanl = NULL; } if (s_optim == 0) { s_optim = optim = 1; s_form = form ? getcpy (form) : NULL; s_format = format ? getcpy (format) : NULL;#ifdef MPOP#ifdef BPOP if (pmsh) { int i; char *dp, *ep, *fp; if (width == 0) width = sc_width (); for (dp = nfs, i = 0; *dp; dp++, i++) if (*dp == '\\' || *dp == '"' || *dp == '\n') i++; i++; if ((ep = malloc ((unsigned) i)) == NULL) adios (NULLCP, "out of memory"); for (dp = nfs, fp = ep; *dp; dp++) { if (*dp == '\n') { *fp++ = '\\', *fp++ = 'n'; continue; } if (*dp == '"' || *dp == '\\') *fp++ = '\\'; *fp++ = *dp; } *fp = NULL; if (pop_command ("XTND SCAN %d \"%s\"", width, ep) == OK) p_optim = 1; free (ep); }#endif#endif /* MPOP */ } else optim = equiv (s_form, form) && equiv (s_format, format);#ifdef MPOP#ifdef BPOP if (p_optim && optim) { for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++) if (!(mp -> msgstats[msgnum] & SELECTED) || Msgs[msgnum].m_scanl) break; if (msgnum > mp -> hghmsg && pop_command ("LIST") == OK) { fprintf (stderr, "Stand-by..."); fflush (stderr); for (;;) { int size; switch (pop_multiline ()) { case NOTOK: fprintf (stderr, "%s", response); /* and fall... */ case DONE: fprintf (stderr,"\n"); break; case OK: if (sscanf (response, "%d %d", &msgnum, &size) == 2 && mp -> lowmsg <= msgnum && msgnum <= mp -> hghmsg && (cp = index (response, '#')) && *++cp) Msgs[msgnum].m_scanl = concat (cp, "\n", NULLCP); continue; } break; } } }#endif#endif /* MPOP */ interrupted = 0; for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel && !interrupted; msgnum++) if (mp -> msgstats[msgnum] & SELECTED) { if (optim && Msgs[msgnum].m_scanl) printf ("%s", Msgs[msgnum].m_scanl); else {#ifdef MPOP#ifdef BPOP if (p_optim && optim && (mp -> msgstats[msgnum] & VIRTUAL) && pop_command ("LIST %d", msgnum) == OK && (cp = index (response, '#')) && *++cp) { Msgs[msgnum].m_scanl = concat (cp, "\n", NULLCP); printf ("%s", Msgs[msgnum].m_scanl); continue; }#endif#endif /* MPOP */ zp = msh_ready (msgnum, 0); switch (state = scan (zp, msgnum, 0, nfs, width, msgnum == mp -> curmsg, mp -> msgstats[msgnum] & UNSEEN, /* ?? */ headersw ? (fmsh ? fmsh : mp -> foldpath) : (char *)0, fmsh ? 0L : (long) (Msgs[msgnum].m_stop - Msgs[msgnum].m_start), 1)) { case SCNMSG: case SCNENC: case SCNERR: if (optim) Msgs[msgnum].m_scanl = getcpy (scanl); break; default: advise (NULLCP, "scan() botch (%d)", state); return; case SCNEOF: printf ("%*d empty\n", DMAXFOLDER, msgnum); break; } } headersw = 0; } if (clearsw) clear_screen ();}/* */static struct swit showswit[] = {#define SHDRAFT 0 "draft", 5,#define SHFORM 1 "form formfile", 4,#define SHPROG 2 "moreproc program", 4,#define SHNPROG 3 "nomoreproc", 3,#define SHLEN 4 "length lines", 4,#define SHWID 5 "width columns", 4,#define SHSHOW 6 "showproc program", 4,#define SHNSHOW 7 "noshowproc", 3,#define SHHEAD 8 "header", 4,#define SHNHEAD 9 "noheader", 3,#define SHHELP 10 "help", 4, NULL, 0};/* */showcmd (args)char **args;{ int headersw = 1, nshow = 0, msgp = 0, vecp = 1, mhl = 0, seen = 0, mode = 0, i, msgnum; char *cp, *proc = showproc, buf[BUFSIZ], *msgs[MAXARGS], *vec[MAXARGS]; if (uleq (cmd_name, "next")) mode = 1; else if (uleq (cmd_name, "prev")) mode = -1; while (cp = *args++) { if (*cp == '-') switch (i = smatch (++cp, showswit)) { case AMBIGSW: ambigsw (cp, showswit); return; case UNKWNSW: case SHNPROG: vec[vecp++] = --cp; continue; case SHHELP: (void) sprintf (buf, "%s %s[switches] [switches for showproc]", cmd_name, mode ? NULL : "[msgs] "); help (buf, showswit); return; case SHFORM: case SHPROG: case SHLEN: case SHWID: vec[vecp++] = --cp; if (!(cp = *args++) || *cp == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } vec[vecp++] = cp; continue; case SHHEAD: headersw++; continue; case SHNHEAD: headersw = 0; continue; case SHSHOW: if (!(proc = *args++) || *proc == '-') { advise (NULLCP, "missing argument to %s", args[-2]); return; } nshow = 0; continue; case SHNSHOW: nshow++; continue; case SHDRAFT: advise (NULLCP, "sorry, -%s not allowed!", showswit[i].sw); return; } if (*cp == '+' || *cp == '@') { advise (NULLCP, "sorry, no folders allowed!"); return; } else if (mode) { fprintf (stderr, "usage: %s [switches] [switches for showproc]\n", cmd_name); return; } else msgs[msgp++] = cp; } vec[vecp] = NULL; if (!msgp) msgs[msgp++] = mode > 0 ? "next" : mode < 0 ? "prev" : "cur"; for (msgnum = 0; msgnum < msgp; msgnum++) if (!m_convert (mp, msgs[msgnum])) return; m_setseq (mp);#ifdef MIME if (!nshow && !getenv ("NOMHNPROC")) for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) if ((mp -> msgstats[msgnum] & SELECTED) && nontext (msgnum)) { proc = (cp = m_find ("mhnproc")) ? cp : "mhn"; vec[vecp++] = "-show"; vec[vecp++] = "-file"; vec[vecp] = NULL; goto finish; }#endif /* MIME */ if (nshow) proc = "cat"; else if (strcmp (showproc, "mhl") == 0) { proc = mhlproc; mhl++; }finish: ; seen = m_seqflag (mp, "unseen"); vec[0] = r1bindex (proc, '/'); if (mhl) { msgp = vecp; for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -