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

📄 m2d_execute.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)m2d_execute.c 1.1 92/07/30";#endif#endif#include <stdio.h>#include "m2d_def.h"#include <sys/stat.h>#include <sunwindow/sun.h>int	d2m_special_cmd();char	*malloc();extern struct      grouphead       *m2d_groups[];/* Pointer to active groups */int	m2d_invoker = NOPROG;static int	cond = CANY;		/* current state of conditional exc. */static int	group(), set(), ifcmd(), elsecmd(), endifcmd();/* minimum number of args to set is 1 to alias definition is 2 */static struct cmd cmdtab[] = {	"alias",        group,          0,      2,      1000,	"set",          set,            0,      1,      1000,	"if",		ifcmd,		0,	1,	1,	"else",		elsecmd,	0,	0,	0,	"endif",	endifcmd,	0,	0,	0,	0,              0,              0,              0,      0};static char	line[LINESIZE];m2d_commands(mailrc_fd)FILE	*mailrc_fd;{	/* execute each line that is a set or an alias */	/* adding their contents to an appropriate data structure */        while(readline(mailrc_fd, line)) 		(void)execute(line);}d2m_commands(mailrc_fd)FILE	*mailrc_fd;{	int	known;	/* execute each line that is a set or an alias */	/* adding their contents to an appropriate data structure */        while(readline(mailrc_fd, line)) {		known = execute(line);		d2m_special_cmd(line, known);	}}staticexecute(linebuf)	char linebuf[];{	char word[LINESIZE];	char *arglist[MAXARGC];	struct cmd *com;	register char *cp, *cp2;	register int c;	int edstop(), e;	int	len;	/* check for blank lines */	len = strlen(linebuf);	if (len == 0)		return(EX_UNKNOWN);	if (linebuf[len - 1] == '\n') {		linebuf[len - 1] = '\0';		if (len == 1)			return(EX_UNKNOWN);	}	cp = linebuf;	while (any(*cp, " \t"))		cp++;	cp2 = word;	while (*cp && !any(*cp, " \t0123456789$^.:/-+*'\""))		*cp2++ = *cp++;	*cp2 = '\0';	if (word[0] == '\0')		return(EX_UNKNOWN);	if ((com = lex(word)) == NONE)		return(EX_UNKNOWN);	if ((c = getrawlist(cp, arglist)) < 0)		return(EX_UNKNOWN);	if (c < com->c_minargs) {		(void)printf("%s requires at least %d arg(s)\n",			com->c_name, com->c_minargs);		return(EX_UNKNOWN);	}	if (c > com->c_maxargs) {		(void)printf("%s takes no more than %d arg(s)\n",			com->c_name, com->c_maxargs);		return(EX_UNKNOWN);	}	e = (*com->c_func)(arglist);	return((e == 0) ? EX_KNOWN : EX_UNKNOWN);}/* * Is ch any of the characters in str? */staticany(ch, str)	char *str;{	register char *f;	register c;	f = str;	c = ch;	while (*f)		if (c == *f++)			return(1);	return(0);}/* * Find the correct command in the command table corresponding * to the passed command "word" */static struct cmd *lex(word)	char word[];{	register struct cmd *cp;	for (cp = &cmdtab[0]; cp->c_name != NOSTR; cp++)		if (isprefix(word, cp->c_name))			return(cp);	return(NONE);}/* * Return a pointer to a dynamic copy of the argument. */static char *savestr(str)	char *str;{	register char *cp, *cp2, *top;	for (cp = str; *cp; cp++)		;	top = malloc((unsigned)(cp-str + 1));	if (top == NOSTR)		return(NOSTR);	for (cp = str, cp2 = top; *cp; cp++)		*cp2++ = *cp;	*cp2 = 0;	return(top);}/* * Scan out the list of string arguments, shell style * for a RAWLIST. *//* ARGSUSED */staticgetrawlist(line_local, argv)	char line_local[];	char **argv;{	register char **ap, *cp, *cp2;	char linebuf[BUFSIZ], quotec;	ap = argv;	cp = line_local;	while (*cp != '\0') {		while (any(*cp, " \t"))			cp++;		cp2 = linebuf;		quotec = 0;		while (*cp != '\0') {			if (quotec) {				if (*cp == quotec)					quotec=0;				*cp2++ = *cp++;			} else {				if (any(*cp, " \t"))					break;				if (any(*cp, "'\""))					quotec = *cp;				*cp2++ = *cp++;			}		}		*cp2 = '\0';		if (cp2 == linebuf)			break;		*ap++ = savestr(linebuf);	}	*ap = NOSTR;	return(ap-argv);}/* * Determine if as1 is a valid prefix of as2. * Return true if yep. */staticisprefix(as1, as2)	char *as1, *as2;{	register char *s1, *s2;	s1 = as1;	s2 = as2;	while (*s1++ == *s2)		if (*s2++ == '\0')			return(1);	return(*--s1 == '\0');}/* * Conditional commands.  These allow one to parameterize one's * .mailrc and do some things if sending, others if receiving. */staticifcmd(argv)	char **argv;{	register char *cp;	if (cond != CANY) {		(void)printf("Illegal nested \"if\"\n");		return(2);	}	cond = CANY;	cp = argv[0];	switch (*cp) {	case 'r': case 'R':		cond = CRCV;		break;	case 's': case 'S':		cond = CSEND;		break;	case 't': case 'T':		cond = CTTY;		break;	default:		(void)printf("Unrecognized if-keyword: \"%s\"\n", cp);		return(2);	}	return(1);}/* * Implement 'else'.  This is pretty simple -- we just * flip over the conditional flag. */staticelsecmd(){	switch (cond) {	case CANY:		(void)printf("\"Else\" without matching \"if\"\n");		return(2);	case CSEND:		cond = CRCV;		break;	case CRCV:		cond = CSEND;		break;	case CTTY:		cond = CNOTTY;		break;	case CNOTTY:		cond = CTTY;		break;	default:		(void)printf("invalid condition encountered\n");		cond = CANY;		break;	}	return(1);}/* * End of if statement.  Just set cond back to anything. */staticendifcmd(){	if (cond == CANY) {		(void)printf("\"Endif\" without matching \"if\"\n");		return(2);	}	cond = CANY;	return(1);}/* * Read up a line from the specified input into the line * buffer.  Return the number of characters read.  Do not * include the newline at the end. */staticreadline(ibuf, linebuf)	FILE *ibuf;	char *linebuf;{	register char *cp;	register int c;	int seennulls = 0;	do {		clearerr(ibuf);		c = getc(ibuf);		for (cp = linebuf; c != '\n' && c != EOF; c = getc(ibuf)) {			if (c == 0) {				if (!seennulls) {					fputs("Mail: ignoring NULL characters in mail\n", stderr);					seennulls++;				}				continue;			}			if (cp - linebuf < LINESIZE-2) {				if (c == '\\') {					c = getc(ibuf);					c = ' ';				}				*cp++ = c;			}		}	} while (ferror(ibuf) && ibuf == stdin);	*cp = 0;	if (c == EOF && cp == linebuf)		return(0);	return(cp - linebuf + 1);}staticset(arglist)	char **arglist;{	register char *cp, *cp2;	char varbuf[BUFSIZ], **ap;	int errs;	if (cond != CANY)		return(-1);	errs = 0;	for (ap = arglist; *ap != NOSTR; ap++) {		cp = *ap;		cp2 = varbuf;		while (*cp != '=' && *cp != '\0')			*cp2++ = *cp++;		*cp2 = '\0';		if (*cp == '\0')			cp = "";		else			cp++;		if (equal(varbuf, "")) {			(void)printf("Non-null variable name required\n");			errs++;			continue;		}		if (m2d_invoker == MAILRC_TO_DEFAULTS)			m2d_assign(varbuf, cp);	}	return(errs);}/* * Put add users to a group. */staticgroup(argv)	char **argv;{	register struct grouphead *gh;	register struct group *gp;	register int h;	char **ap, *gname;	if (cond != CANY)		return(-1);	if (m2d_invoker == DEFAULTS_TO_MAILRC)		return(0);	gname = *argv;	h = m2d_hash(gname);	if ((gh = m2d_findgroup(gname)) == NOGRP) {		gh = (struct grouphead *) (LINT_CAST(calloc(		    1, (unsigned)(sizeof *gh))));		gh->g_name = m2d_vcopy(gname);		gh->g_list = NOGE;		gh->g_link = m2d_groups[h];		m2d_groups[h] = gh;	}	/*	 * Insert names from the command list into the group.	 * Who cares if there are duplicates?  They get tossed	 * later anyway.	 */	for (ap = argv+1; *ap != NOSTR; ap++) {		gp = (struct group *) (LINT_CAST(			calloc(1, (unsigned)(sizeof *gp))));		gp->ge_name = m2d_vcopy(*ap);		gp->ge_link = gh->g_list;		gh->g_list = gp;	}	return(0);}

⌨️ 快捷键说明

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