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

📄 regcomp.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
					regset(bits,def,class);				lastclass = 1234;				continue;			case 'W':				for (class = 0; class < 256; class++)				    if (!isALNUM(class))					regset(bits,def,class);				lastclass = 1234;				continue;			case 's':				for (class = 0; class < 256; class++)				    if (isSPACE(class))					regset(bits,def,class);				lastclass = 1234;				continue;			case 'S':				for (class = 0; class < 256; class++)				    if (!isSPACE(class))					regset(bits,def,class);				lastclass = 1234;				continue;			case 'd':				for (class = '0'; class <= '9'; class++)					regset(bits,def,class);				lastclass = 1234;				continue;			case 'D':				for (class = 0; class < '0'; class++)					regset(bits,def,class);				for (class = '9' + 1; class < 256; class++)					regset(bits,def,class);				lastclass = 1234;				continue;			case 'n':				class = '\n';				break;			case 'r':				class = '\r';				break;			case 't':				class = '\t';				break;			case 'f':				class = '\f';				break;			case 'b':				class = '\b';				break;			case 'e':				class = '\033';				break;			case 'a':				class = '\007';				break;			case 'x':				class = scanhex(regparse, 2, &numlen);				regparse += numlen;				break;			case 'c':				class = *regparse++;				if (isLOWER(class))				    class = toupper(class);				class ^= 64;				break;			case '0': case '1': case '2': case '3': case '4':			case '5': case '6': case '7': case '8': case '9':				class = scanoct(--regparse, 3, &numlen);				regparse += numlen;				break;			}		}		if (range) {			if (lastclass > class)				FAIL("invalid [] range in regexp");			range = 0;		}		else {			lastclass = class;			if (*regparse == '-' && regparse+1 < regxend &&			    regparse[1] != ']') {				regparse++;				range = 1;				continue;	/* do it next time */			}		}		for ( ; lastclass <= class; lastclass++) {			regset(bits,def,lastclass);			if (regfold && isUPPER(lastclass))				regset(bits,def,tolower(lastclass));		}		lastclass = class;	}	if (*regparse != ']')		FAIL("unmatched [] in regexp");	regparse++;	return ret;}/* - regnode - emit a node */static char *			/* Location. */regnode(op)char op;{	register char *ret;	register char *ptr;	ret = regcode;	if (ret == &regdummy) {#ifdef REGALIGN		if (!(regsize & 1))			regsize++;#endif		regsize += 3;		return(ret);	}#ifdef REGALIGN#ifndef lint	if (!((long)ret & 1))	    *ret++ = 127;#endif#endif	ptr = ret;	*ptr++ = op;	*ptr++ = '\0';		/* Null "next" pointer. */	*ptr++ = '\0';	regcode = ptr;	return(ret);}/* - reganode - emit a node with an argument */static char *			/* Location. */reganode(op, arg)char op;unsigned short arg;{	register char *ret;	register char *ptr;	ret = regcode;	if (ret == &regdummy) {#ifdef REGALIGN		if (!(regsize & 1))			regsize++;#endif		regsize += 5;		return(ret);	}#ifdef REGALIGN#ifndef lint	if (!((long)ret & 1))	    *ret++ = 127;#endif#endif	ptr = ret;	*ptr++ = op;	*ptr++ = '\0';		/* Null "next" pointer. */	*ptr++ = '\0';#ifdef REGALIGN	*(unsigned short *)(ret+3) = arg;#else	ret[3] = arg >> 8; ret[4] = arg & 0377;#endif	ptr += 2;	regcode = ptr;	return(ret);}/* - regc - emit (if appropriate) a byte of code */static voidregc(b)char b;{	if (regcode != &regdummy)		*regcode++ = b;	else		regsize++;}/* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */static voidreginsert(op, opnd)char op;char *opnd;{	register char *src;	register char *dst;	register char *place;	register offset = (op == CURLY ? 4 : 0);	if (regcode == &regdummy) {#ifdef REGALIGN		regsize += 4 + offset;#else		regsize += 3 + offset;#endif		return;	}	src = regcode;#ifdef REGALIGN	regcode += 4 + offset;#else	regcode += 3 + offset;#endif	dst = regcode;	while (src > opnd)		*--dst = *--src;	place = opnd;		/* Op node, where operand used to be. */	*place++ = op;	*place++ = '\0';	*place++ = '\0';	while (offset-- > 0)	    *place++ = '\0';#ifdef REGALIGN	*place++ = '\177';#endif}/* - regtail - set the next-pointer at the end of a node chain */static voidregtail(p, val)char *p;char *val;{	register char *scan;	register char *temp;	register int offset;	if (p == &regdummy)		return;	/* Find last node. */	scan = p;	for (;;) {		temp = regnext(scan);		if (temp == NULL)			break;		scan = temp;	}#ifdef REGALIGN	offset = val - scan;#ifndef lint	*(short*)(scan+1) = offset;#else	offset = offset;#endif#else	if (OP(scan) == BACK)		offset = scan - val;	else		offset = val - scan;	*(scan+1) = (offset>>8)&0377;	*(scan+2) = offset&0377;#endif}/* - regoptail - regtail on operand of first argument; nop if operandless */static voidregoptail(p, val)char *p;char *val;{	/* "Operandless" and "op != BRANCH" are synonymous in practice. */	if (p == NULL || p == &regdummy || OP(p) != BRANCH)		return;	regtail(NEXTOPER(p), val);}/* - regcurly - a little FSA that accepts {\d+,?\d*} */STATIC intregcurly(s)register char *s;{    if (*s++ != '{')	return FALSE;    if (!isDIGIT(*s))	return FALSE;    while (isDIGIT(*s))	s++;    if (*s == ',')	s++;    while (isDIGIT(*s))	s++;    if (*s != '}')	return FALSE;    return TRUE;}#ifdef DEBUGGING/* - regdump - dump a regexp onto stderr in vaguely comprehensible form */voidregdump(r)regexp *r;{	register char *s;	register char op = EXACTLY;	/* Arbitrary non-END op. */	register char *next;	s = r->program + 1;	while (op != END) {	/* While that wasn't END last time... */#ifdef REGALIGN		if (!((long)s & 1))			s++;#endif		op = OP(s);		fprintf(stderr,"%2d%s", s-r->program, regprop(s));	/* Where, what. */		next = regnext(s);		s += regarglen[op];		if (next == NULL)		/* Next ptr. */			fprintf(stderr,"(0)");		else 			fprintf(stderr,"(%d)", (s-r->program)+(next-s));		s += 3;		if (op == ANYOF) {			s += 32;		}		if (op == EXACTLY) {			/* Literal string, where present. */			s++;			while (*s != '\0') {				(void)putchar(*s);				s++;			}			s++;		}		(void)putchar('\n');	}	/* Header fields of interest. */	if (r->regstart)		fprintf(stderr,"start `%s' ", r->regstart->str_ptr);	if (r->regstclass)		fprintf(stderr,"stclass `%s' ", regprop(r->regstclass));	if (r->reganch & ROPT_ANCH)		fprintf(stderr,"anchored ");	if (r->reganch & ROPT_SKIP)		fprintf(stderr,"plus ");	if (r->reganch & ROPT_IMPLICIT)		fprintf(stderr,"implicit ");	if (r->regmust != NULL)		fprintf(stderr,"must have \"%s\" back %d ", r->regmust->str_ptr,		  r->regback);	fprintf(stderr, "minlen %d ", r->minlen);	fprintf(stderr,"\n");}/* - regprop - printable representation of opcode */char *regprop(op)char *op;{	register char *p;	(void) strcpy(buf, ":");	switch (OP(op)) {	case BOL:		p = "BOL";		break;	case EOL:		p = "EOL";		break;	case ANY:		p = "ANY";		break;	case ANYOF:		p = "ANYOF";		break;	case BRANCH:		p = "BRANCH";		break;	case EXACTLY:		p = "EXACTLY";		break;	case NOTHING:		p = "NOTHING";		break;	case BACK:		p = "BACK";		break;	case END:		p = "END";		break;	case ALNUM:		p = "ALNUM";		break;	case NALNUM:		p = "NALNUM";		break;	case BOUND:		p = "BOUND";		break;	case NBOUND:		p = "NBOUND";		break;	case SPACE:		p = "SPACE";		break;	case NSPACE:		p = "NSPACE";		break;	case DIGIT:		p = "DIGIT";		break;	case NDIGIT:		p = "NDIGIT";		break;	case CURLY:		(void)sprintf(buf+strlen(buf), "CURLY {%d,%d}",		    ARG1(op),ARG2(op));		p = NULL;		break;	case REF:		(void)sprintf(buf+strlen(buf), "REF%d", ARG1(op));		p = NULL;		break;	case OPEN:		(void)sprintf(buf+strlen(buf), "OPEN%d", ARG1(op));		p = NULL;		break;	case CLOSE:		(void)sprintf(buf+strlen(buf), "CLOSE%d", ARG1(op));		p = NULL;		break;	case STAR:		p = "STAR";		break;	case PLUS:		p = "PLUS";		break;	default:		FAIL("corrupted regexp opcode");	}	if (p != NULL)		(void) strcat(buf, p);	return(buf);}#endif /* DEBUGGING */voidregfree(r)struct regexp *r;{	if (r->precomp) {		Safefree(r->precomp);		r->precomp = Nullch;	}	if (r->subbase) {		Safefree(r->subbase);		r->subbase = Nullch;	}	if (r->regmust) {		str_free(r->regmust);		r->regmust = Nullstr;	}	if (r->regstart) {		str_free(r->regstart);		r->regstart = Nullstr;	}	Safefree(r->startp);	Safefree(r->endp);	Safefree(r);}

⌨️ 快捷键说明

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