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

📄 list.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;		if (argn >= argc - 1) {			printf(			"Too many elements in the list; excess discarded.\n");			break;		}		cp2 = linebuf;		quotec = '\0';		while ((c = *cp) != '\0') {			cp++;			if (quotec != '\0') {				if (c == quotec)					quotec = '\0';				else if (c == '\\')					switch (c = *cp++) {					case '\0':						*cp2++ = '\\';						cp--;						break;					case '0': case '1': case '2': case '3':					case '4': case '5': case '6': case '7':						c -= '0';						if (*cp >= '0' && *cp <= '7')							c = c * 8 + *cp++ - '0';						if (*cp >= '0' && *cp <= '7')							c = c * 8 + *cp++ - '0';						*cp2++ = c;						break;					case 'b':						*cp2++ = '\b';						break;					case 'f':						*cp2++ = '\f';						break;					case 'n':						*cp2++ = '\n';						break;					case 'r':						*cp2++ = '\r';						break;					case 't':						*cp2++ = '\t';						break;					case 'v':						*cp2++ = '\v';						break;					default:						*cp2++ = c;					}				else if (c == '^') {					c = *cp++;					if (c == '?')						*cp2++ = '\177';					/* null doesn't show up anyway */					else if (c >= 'A' && c <= '_' ||						 c >= 'a' && c <= 'z')						*cp2++ = c & 037;					else {						*cp2++ = '^';						cp--;					}				} else					*cp2++ = c;			} else if (c == '"' || c == '\'')				quotec = c;			else if (c == ' ' || c == '\t')				break;			else				*cp2++ = c;		}		*cp2 = '\0';		argv[argn++] = savestr(linebuf);	}	argv[argn] = NOSTR;	return argn;}/* * scan out a single lexical item and return its token number, * updating the string pointer passed **p.  Also, store the value * of the number or string scanned in lexnumber or lexstring as * appropriate.  In any event, store the scanned `thing' in lexstring. */struct lex {	char	l_char;	char	l_token;} singles[] = {	'$',	TDOLLAR,	'.',	TDOT,	'^',	TUP,	'*',	TSTAR,	'-',	TDASH,	'+',	TPLUS,	'(',	TOPEN,	')',	TCLOSE,	0,	0};intscan(sp)	char **sp;{	register char *cp, *cp2;	register int c;	register struct lex *lp;	int quotec;	if (regretp >= 0) {		strcpy(lexstring, string_stack[regretp]);		lexnumber = numberstack[regretp];		return(regretstack[regretp--]);	}	cp = *sp;	cp2 = lexstring;	c = *cp++;	/*	 * strip away leading white space.	 */	while (c == ' ' || c == '\t')		c = *cp++;	/*	 * If no characters remain, we are at end of line,	 * so report that.	 */	if (c == '\0') {		*sp = --cp;		return(TEOL);	}	/*	 * If the leading character is a digit, scan	 * the number and convert it on the fly.	 * Return TNUMBER when done.	 */	if (isdigit(c)) {		lexnumber = 0;		while (isdigit(c)) {			lexnumber = lexnumber*10 + c - '0';			*cp2++ = c;			c = *cp++;		}		*cp2 = '\0';		*sp = --cp;		return(TNUMBER);	}	/*	 * Check for single character tokens; return such	 * if found.	 */	for (lp = &singles[0]; lp->l_char != 0; lp++)		if (c == lp->l_char) {			lexstring[0] = c;			lexstring[1] = '\0';			*sp = cp;			return(lp->l_token);		}	/*	 * We've got a string!  Copy all the characters	 * of the string into lexstring, until we see	 * a null, space, or tab.	 * If the lead character is a " or ', save it	 * and scan until you get another.	 */	quotec = 0;	if (c == '\'' || c == '"') {		quotec = c;		c = *cp++;	}	while (c != '\0') {		if (c == quotec) {			cp++;			break;		}		if (quotec == 0 && (c == ' ' || c == '\t'))			break;		if (cp2 - lexstring < STRINGLEN-1)			*cp2++ = c;		c = *cp++;	}	if (quotec && c == 0) {		fprintf(stderr, "Missing %c\n", quotec);		return TERROR;	}	*sp = --cp;	*cp2 = '\0';	return(TSTRING);}/* * Unscan the named token by pushing it onto the regret stack. */voidregret(token)	int token;{	if (++regretp >= REGDEP)		panic("Too many regrets");	regretstack[regretp] = token;	lexstring[STRINGLEN-1] = '\0';	string_stack[regretp] = savestr(lexstring);	numberstack[regretp] = lexnumber;}/* * Reset all the scanner global variables. */voidscaninit(){	regretp = -1;}/* * Find the first message whose flags & m == f  and return * its message number. */intfirst(f, m)	int f, m;{	register struct message *mp;	if (msgCount == 0)		return 0;	f &= MDELETED;	m &= MDELETED;	for (mp = dot; mp < &message[msgCount]; mp++)		if ((mp->m_flag & m) == f)			return mp - message + 1;	for (mp = dot-1; mp >= &message[0]; mp--)		if ((mp->m_flag & m) == f)			return mp - message + 1;	return 0;}/* * See if the passed name sent the passed message number.  Return true * if so. */intmatchsender(str, mesg)	char *str;	int mesg;{	register char *cp, *cp2, *backup;	if (!*str)	/* null string matches nothing instead of everything */		return 0;	backup = cp2 = nameof(&message[mesg - 1], 0);	cp = str;	while (*cp2) {		if (*cp == 0)			return(1);		if (raise(*cp++) != raise(*cp2++)) {			cp2 = ++backup;			cp = str;		}	}	return(*cp == 0);}/* * See if the given string matches inside the subject field of the * given message.  For the purpose of the scan, we ignore case differences. * If it does, return true.  The string search argument is assumed to * have the form "/search-string."  If it is of the form "/," we use the * previous search string. */char lastscan[128];intmatchsubj(str, mesg)	char *str;	int mesg;{	register struct message *mp;	register char *cp, *cp2, *backup;	str++;	if (strlen(str) == 0)		str = lastscan;	else		strcpy(lastscan, str);	mp = &message[mesg-1];		/*	 * Now look, ignoring case, for the word in the string.	 */	if (value("searchheaders") && (cp = index(str, ':'))) {		*cp++ = '\0';		cp2 = hfield(str, mp);		cp[-1] = ':';		str = cp;	} else {		cp = str;		cp2 = hfield("subject", mp);	}	if (cp2 == NOSTR)		return(0);	backup = cp2;	while (*cp2) {		if (*cp == 0)			return(1);		if (raise(*cp++) != raise(*cp2++)) {			cp2 = ++backup;			cp = str;		}	}	return(*cp == 0);}/* * Mark the named message by setting its mark bit. */voidmark(mesg)	int mesg;{	register int i;	i = mesg;	if (i < 1 || i > msgCount)		panic("Bad message number to mark");	message[i-1].m_flag |= MMARK;}/* * Unmark the named message. */voidunmark(mesg)	int mesg;{	register int i;	i = mesg;	if (i < 1 || i > msgCount)		panic("Bad message number to unmark");	message[i-1].m_flag &= ~MMARK;}/* * Return the message number corresponding to the passed meta character. */intmetamess(meta, f)	int meta, f;{	register int c, m;	register struct message *mp;	c = meta;	switch (c) {	case '^':		/*		 * First 'good' message left.		 */		for (mp = &message[0]; mp < &message[msgCount]; mp++)			if ((mp->m_flag & MDELETED) == f)				return(mp - &message[0] + 1);		printf("No applicable messages\n");		return(-1);	case '$':		/*		 * Last 'good message left.		 */		for (mp = &message[msgCount-1]; mp >= &message[0]; mp--)			if ((mp->m_flag & MDELETED) == f)				return(mp - &message[0] + 1);		printf("No applicable messages\n");		return(-1);	case '.':		/* 		 * Current message.		 */		m = dot - &message[0] + 1;		if ((dot->m_flag & MDELETED) != f) {			printf("%d: Inappropriate message\n", m);			return(-1);		}		return(m);	default:		printf("Unknown metachar (%c)\n", c);		return(-1);	}}

⌨️ 快捷键说明

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