regcmp.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 243 行

C
243
字号
#ifdef lintstatic char *sccsid = "@(#)regcmp.c	4.1	(ULTRIX)	7/17/90";#endif#define SSIZE	50#define TGRP	48#define A256	02#define ZERO	01#define	NBRA	10#define CIRCFL	32;#define SLOP	5#define	EOF	0#define	CBRA	60#define GRP	40#define SGRP	56#define PGRP	68#define EGRP	44#define RNGE	03#define	CCHR	20#define	CDOT	64#define	CCL	24#define	NCCL	8#define	CDOL	28#define	CEOF	52#define	CKET	12#define	STAR	01#define PLUS	02#define MINUS	16#include <varargs.h>int	*__sp_;char	*__stmax;int	__i_size;char *regcmp(va_alist)va_dcl{	register c;	register char *ep, *sp;	char *adx;	int i,cflg;	char *lastep, *sep, *eptr;	char bracket[NBRA], *bracketp;	int nbra,ngrp;	int cclcnt;	int stack[SSIZE];	va_list ap;	va_start(ap);	__sp_ = (int *)stack;	*__sp_ = -1;	__stmax = (char *) &stack[SSIZE];	adx = va_arg(ap, char *);	i = nbra = ngrp = 0;	while (adx) {		i += __size(adx);		adx = va_arg(ap, char *);	}	va_end(ap);	va_start(ap);	adx = va_arg(ap, char *);	sp = adx;	adx = va_arg(ap, char *);	if((sep = ep = (char *)malloc(2*i+SLOP)) == (char *)0)		return(0);	bracketp = bracket;	if ((c = *sp++) == EOF) goto cerror;	if (c=='^') {		c = *sp++;		*ep++ = CIRCFL;	}	if ((c=='*') || (c=='+') || (c=='{'))		goto cerror;	sp--;	for (;;) {		if ((c = *sp++) == EOF) {			if (adx) {				sp = adx;				adx = va_arg(ap, char *);				continue;			}			*ep++ = CEOF;			if (--nbra > NBRA || *__sp_ != -1)				goto cerror;			__i_size = ep - sep;			return(sep);		}		if ((c!='*') && (c!='{')  && (c!='+'))			lastep = ep;		switch (c) {		case '(':			if (!__rpush(ep)) goto cerror;			*ep++ = CBRA;			*ep++ = -1;			continue;		case ')':			if (!(eptr=(char *)__rpop())) goto cerror;			if ((c = *sp++) == '$') {				if ('0' > (c = *sp++) || c > '9')					goto cerror;				*ep++ = CKET;				*ep++ = *++eptr = nbra++;				*ep++ = (c-'0');				continue;			}			*ep++ = EGRP;			*ep++ = ngrp++;			sp--;			switch (c) {			case '+':				*eptr = PGRP;				break;			case '*':				*eptr = SGRP;				break;			case '{':				*eptr = TGRP;				break;			default:				*eptr = GRP;				continue;			}			i = ep - eptr - 2;			for (cclcnt = 0; i >= 256; cclcnt++)				i -= 256;			if (cclcnt > 3) goto cerror;			*eptr |= cclcnt;			*++eptr = i;			continue;		case '\\':			*ep++ = CCHR;			if ((c = *sp++) == EOF)				goto cerror;			*ep++ = c;			continue;		case '{':			*lastep |= RNGE;			cflg = 0;		nlim:			if ((c = *sp++) == '}') goto cerror;			i = 0;			do {				if ('0' <= c && c <= '9')					i = (i*10+(c-'0'));				else goto cerror;			} while (((c = *sp++) != '}') && (c != ','));			if (i>255) goto cerror;			*ep++ = i;			if (c==',') {				if (cflg++) goto cerror;				if((c = *sp++) == '}') {					*ep++ = -1;					continue;				}				else {					sp--;					goto nlim;				}			}			if (!cflg) *ep++ = i;			else if ((ep[-1]&0377) < (ep[-2]&0377)) goto cerror;			continue;		case '.':			*ep++ = CDOT;			continue;		case '+':			if (*lastep==CBRA || *lastep==CKET)				goto cerror;			*lastep |= PLUS;			continue;		case '*':			if (*lastep==CBRA || *lastep==CKET)			goto cerror;			*lastep |= STAR;			continue;		case '$':			if ((*sp != EOF) || (adx))				goto defchar;			*ep++ = CDOL;			continue;		case '[':			*ep++ = CCL;			*ep++ = 0;			cclcnt = 1;			if ((c = *sp++) == '^') {				c = *sp++;				ep[-2] = NCCL;			}			do {				if (c==EOF)					goto cerror;				if ((c=='-') && (cclcnt>1) && (*sp!=']')) {					*ep++ = ep[-1];					ep[-2] = MINUS;					cclcnt++;					continue;				}				*ep++ = c;				cclcnt++;			} while ((c = *sp++) != ']');			lastep[1] = cclcnt;			continue;		defchar:		default:			*ep++ = CCHR;			*ep++ = c;		}	}   cerror:	free(sep);	return(0);}__size(strg) char *strg;{	int	i;	i = 1;	while(*strg++) i++;	return(i);}__rpop() {	return (*__sp_ == -1)?0:*__sp_--;}__rpush(ptr) char *ptr;{	if (++__sp_ > (int *)__stmax) return(0);	*__sp_ = (int)ptr;	return(1);}

⌨️ 快捷键说明

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