⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mshcmds.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
    "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 + -