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

📄 mshcmds.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 4 页
字号:
	if (!md)	    goto done_pack;    }    if (!msgp)	msgs[msgp++] = "all";    for (msgnum = 0; msgnum < msgp; msgnum++)	if (!m_convert (mp, msgs[msgnum]))	    goto done_pack;    m_setseq (mp);    if ((md = mbx_open (file, getuid (), getgid (), m_gmprot ())) == NOTOK) {	advise (file, "unable to open");	goto done_pack;    }    for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)	if (mp -> msgstats[msgnum] & SELECTED)	    if (pack (file, md, msgnum) == NOTOK)		break;    (void) mbx_close (file, md);    if (mp -> hghsel != mp -> curmsg)	m_setcur (mp, mp -> lowsel);done_pack: ;    free (file);}/*  */int	pack (mailbox, md, msgnum)char   *mailbox;int     md,        msgnum;{    register FILE *zp;    if (Msgs[msgnum].m_bboard_id == 0)	(void) readid (msgnum);    zp = msh_ready (msgnum, 1);    return mbx_write (mailbox, md, zp, Msgs[msgnum].m_bboard_id,	    0L, ftell (zp), Msgs[msgnum].m_stop, 1, 1);}/*  */int	packhak (args)char  **args;{    int	    result;    char   *cp,	   *file = NULL;    while (cp = *args++) {	if (*cp == '-')	    switch (smatch (++cp, packswit)) {		case AMBIGSW: 		case UNKWNSW: 		case PAHELP: 		    return NOTOK;		case PAFISW: 		    if (!(file = *args++) || *file == '-') 			return NOTOK;		    continue;	    }	if (*cp == '+' || *cp == '@')	    return NOTOK;    }    file = path (file ? file : "./msgbox", TFILE);    result = access (file, 0) == NOTOK ? OK : NOTOK;    free (file);    return result;}/*  */static struct swit pickswit[] = {#define	PIANSW	0    "and", 0,#define	PIORSW	1    "or", 0,#define	PINTSW	2    "not", 0,#define	PILBSW	3    "lbrace", 0,#define	PIRBSW	4    "rbrace", 0,#define	PICCSW	5    "cc  pattern", 0,#define	PIDASW	6    "date  pattern", 0,#define	PIFRSW	7    "from  pattern", 0,#define	PISESW	8    "search  pattern", 0,#define	PISUSW	9    "subject  pattern", 0,#define	PITOSW	10    "to  pattern", 0,#define	PIOTSW	11    "-othercomponent  pattern", 15,#define	PIAFSW	12    "after date", 0,#define	PIBFSW	13    "before date", 0,#define	PIDFSW	14    "datefield field", 5,#define	PISQSW	15    "sequence name", 0,#define	PIPUSW	16    "public", 0,#define	PINPUSW	17    "nopublic", 0,#define	PIZRSW	18    "zero", 0,#define	PINZRSW	19    "nozero", 0,#define	PILISW	20    "list", 0,#define	PINLISW	21    "nolist", 0,#define	PIHELP	22    "help", 4,    NULL, NULL};/*  */pickcmd (args)char  **args;{    int     zerosw = 1,            msgp = 0,            seqp = 0,            vecp = 0,            hi,            lo,            msgnum;    char   *cp,            buf[BUFSIZ],           *msgs[MAXARGS],           *seqs[NATTRS],           *vec[MAXARGS];    register FILE *zp;    while (cp = *args++) {	if (*cp == '-') {	    if (*++cp == '-') {		vec[vecp++] = --cp;		goto pattern;	    }	    switch (smatch (cp, pickswit)) {		case AMBIGSW: 		    ambigsw (cp, pickswit);		    return;		case UNKWNSW: 		    fprintf (stderr, "-%s unknown\n", cp);		    return;		case PIHELP: 		    (void) sprintf (buf, "%s [msgs] [switches]", cmd_name);		    help (buf, pickswit);		    return;		case PICCSW: 		case PIDASW: 		case PIFRSW: 		case PISUSW: 		case PITOSW: 		case PIDFSW: 		case PIAFSW: 		case PIBFSW: 		case PISESW: 		    vec[vecp++] = --cp;pattern: ;		    if (!(cp = *args++)) {/* allow -xyz arguments */			advise (NULLCP, "missing argument to %s", args[-2]);			return;		    }		    vec[vecp++] = cp;		    continue;		case PIOTSW: 		    advise (NULLCP, "internal error!");		    return;		case PIANSW: 		case PIORSW: 		case PINTSW: 		case PILBSW: 		case PIRBSW: 		    vec[vecp++] = --cp;		    continue;		case PISQSW: 		    if (!(cp = *args++) || *cp == '-') {			advise (NULLCP, "missing argument to %s", args[-2]);			return;		    }		    if (seqp < NATTRS)			seqs[seqp++] = cp;		    else {			advise (NULLCP, "only %d sequences allowed!", NATTRS);			return;		    }		    continue;		case PIZRSW: 		    zerosw++;		    continue;		case PINZRSW: 		    zerosw = 0;		    continue;		case PIPUSW: 	/* not implemented */		case PINPUSW: 		case PILISW: 		case PINLISW: 		    continue;	    }	}	if (*cp == '+' || *cp == '@') {	    advise (NULLCP, "sorry, no folders allowed!");	    return;	}	else	    msgs[msgp++] = cp;    }    vec[vecp] = NULL;    if (!msgp)	msgs[msgp++] = "all";    for (msgnum = 0; msgnum < msgp; msgnum++)	if (!m_convert (mp, msgs[msgnum]))	    return;    m_setseq (mp);    interrupted = 0;    if (!pcompile (vec, NULLCP))	return;    lo = mp -> lowsel;    hi = mp -> hghsel;    for (msgnum = mp -> lowsel;	    msgnum <= mp -> hghsel && !interrupted;	    msgnum++)	if (mp -> msgstats[msgnum] & SELECTED) {	    zp = msh_ready (msgnum, 1);	    if (pmatches (zp, msgnum, fmsh ? 0L : Msgs[msgnum].m_start,			fmsh ? 0L : Msgs[msgnum].m_stop)) {		if (msgnum < lo)		    lo = msgnum;		if (msgnum > hi)		    hi = msgnum;	    }	    else {		mp -> msgstats[msgnum] &= ~SELECTED;		mp -> numsel--;	    }	}    if (interrupted)	return;    mp -> lowsel = lo;    mp -> hghsel = hi;    if (mp -> numsel <= 0) {	advise (NULLCP, "no messages match specification");	return;    }    seqs[seqp] = NULL;    for (seqp = 0; seqs[seqp]; seqp++) {	if (zerosw && !m_seqnew (mp, seqs[seqp], 0))	    return;	for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)	    if (mp -> msgstats[msgnum] & SELECTED)		if (!m_seqadd (mp, seqs[seqp], msgnum, 0))		    return;    }    printf ("%d hit%s\n", mp -> numsel, mp -> numsel == 1 ? "" : "s");}/*  */static struct swit replswit[] = {#define	REANSW	0    "annotate", 0,#define	RENANSW	1    "noannotate", 0,#define	RECCSW	2    "cc type", 0,#define	RENCCSW	3    "nocc type", 0,#define	REDFSW	4    "draftfolder +folder", 0,#define	REDMSW	5    "draftmessage msg", 0,#define	RENDFSW	6    "nodraftfolder", 0,#define	REEDTSW	7    "editor editor", 0,#define	RENEDSW	8    "noedit", 0,#define	REFCCSW	9    "fcc +folder", 0,#define	REFLTSW	10    "filter filterfile", 0,#define	REFRMSW	11    "form formfile", 0,#define	REFRSW	12    "format", 5,#define	RENFRSW	13    "noformat", 7,#define	REINSW	14    "inplace", 0,#define	RENINSW	15    "noinplace", 0,#define	REQUSW	16    "query", 0,#define	RENQUSW	17    "noquery", 0,#define	REWHTSW	18    "whatnowproc program", 0,#define	RENWTSW	19    "nowhatnow", 0,#define	REWIDSW	20    "width columns", 0,#define	REHELP	21    "help", 4,    NULL, NULL};/*  */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 REFRSW: 		case RENFRSW: 		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, NULL};/*  */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;	}    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, NULL};/*  */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;    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;    }    else	optim = equiv (s_form, form) && equiv (s_format, format);    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 {		zp = msh_ready (msgnum, 0);		switch (state = scan (zp, msgnum, 0, nfs, width,			msgnum == mp -> curmsg, headersw,			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;		    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -