亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? regexp.c

?? 使用BorlandC++4.5編譯的一個MUD客戶端程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
		*flagp |= flags&(HASWIDTH|SPSTART);
		break;
	case '\0':
	case '|':
	case ')':
		FAIL("internal urp");	/* Supposed to be caught earlier. */
		break;
	case '?':
	case '+':
	case '*':
		FAIL("?+* follows nothing");
		break;
	case '\\':
		if (*regparse == '\0')
			FAIL("trailing \\");
		ret = regnode(EXACTLY);
		regc(*regparse++);
		regc('\0');
		*flagp |= HASWIDTH|SIMPLE;
		break;
	default: {
			register int len;
			register char ender;

			regparse--;
			len = strcspn(regparse, META);
			if (len <= 0)
				FAIL("internal disaster");
			ender = *(regparse+len);
			if (len > 1 && ISMULT(ender))
				len--;		/* Back off clear of ?+* operand. */
			*flagp |= HASWIDTH;
			if (len == 1)
				*flagp |= SIMPLE;
			ret = regnode(EXACTLY);
			while (len > 0) {
				regc(*regparse++);
				len--;
			}
			regc('\0');
		}
		break;
	}

	return(ret);
}

/*
 - regnode - emit a node
 */
static char *			/* Location. */
regnode(op)
char op;
{
	register char *ret;
	register char *ptr;

	ret = regcode;
	if (ret == &regdummy) {
		regsize += 3;
		return(ret);
	}

	ptr = ret;
	*ptr++ = op;
	*ptr++ = '\0';		/* Null "next" pointer. */
	*ptr++ = '\0';
	regcode = ptr;

	return(ret);
}

/*
 - regc - emit (if appropriate) a byte of code
 */
static void
regc(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 void
reginsert(op, opnd)
char op;
char *opnd;
{
	register char *src;
	register char *dst;
	register char *place;

	if (regcode == &regdummy) {
		regsize += 3;
		return;
	}

	src = regcode;
	regcode += 3;
	dst = regcode;
	while (src > opnd)
		*--dst = *--src;

	place = opnd;		/* Op node, where operand used to be. */
	*place++ = op;
	*place++ = '\0';
	*place++ = '\0';
}

/*
 - regtail - set the next-pointer at the end of a node chain
 */
static void
regtail(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;
	}

	if (OP(scan) == BACK)
		offset = scan - val;
	else
		offset = val - scan;
	*(scan+1) = (offset>>8)&0377;
	*(scan+2) = offset&0377;
}

/*
 - regoptail - regtail on operand of first argument; nop if operandless
 */
static void
regoptail(p, val)
char *p;
char *val;
{
	/* "Operandless" and "op != BRANCH" are synonymous in practice. */
	if (p == NULL || p == &regdummy || OP(p) != BRANCH)
		return;
	regtail(OPERAND(p), val);
}

/*
 * regexec and friends
 */

/*
 * Global work variables for regexec().
 */
static char *reginput;		/* String-input pointer. */
static char *regbol;		/* Beginning of input, for ^ check. */
static char **regstartp;	/* Pointer to startp array. */
static char **regendp;		/* Ditto for endp. */

/*
 * Forwards.
 */
#ifdef PROTOTYPES
static int regtry(regexp *, char *);
static int regmatch(char *);
static int regrepeat(char *);
#else
static int regtry();
static int regmatch();
static int regrepeat();
#endif

/*
 - regexec - match a regexp against a string
 */
int
regexec(prog, string)
register regexp *prog;
register char *string;
{
	register char *s;
	extern char *strchr();

	/* Be paranoid... */
	if (prog == NULL || string == NULL) {
		regerror("NULL parameter");
		return(0);
	}

	/* Check validity of program. */
	if (UCHARAT(prog->program) != MAGIC) {
		regerror("corrupted program");
		return(0);
	}

	/* If there is a "must appear" string, look for it. */
	if (prog->regmust != NULL) {
		s = string;
		while ((s = strchr(s, prog->regmust[0])) != NULL) {
			if (strncmp(s, prog->regmust, prog->regmlen) == 0)
				break;	/* Found it. */
			s++;
		}
		if (s == NULL)	/* Not present. */
			return(0);
	}

	/* Mark beginning of line for ^ . */
	regbol = string;

	/* Simplest case:  anchored match need be tried only once. */
	if (prog->reganch)
		return(regtry(prog, string));

	/* Messy cases:	 unanchored match. */
	s = string;
	if (prog->regstart != '\0')
		/* We know what char it must start with. */
		while ((s = strchr(s, prog->regstart)) != NULL) {
			if (regtry(prog, s))
				return(1);
			s++;
		}
	else
		/* We don't -- general case. */
		do {
			if (regtry(prog, s))
				return(1);
		} while (*s++ != '\0');

	/* Failure. */
	return(0);
}

/*
 - regtry - try match at specific point
 */
static int			/* 0 failure, 1 success */
regtry(prog, string)
regexp *prog;
char *string;
{
	register int i;
	register char **sp;
	register char **ep;

	reginput = string;
	regstartp = prog->startp;
	regendp = prog->endp;

	sp = prog->startp;
	ep = prog->endp;
	for (i = NSUBEXP; i > 0; i--) {
		*sp++ = NULL;
		*ep++ = NULL;
	}
	if (regmatch(prog->program + 1)) {
		prog->startp[0] = string;
		prog->endp[0] = reginput;
		return(1);
	} else
		return(0);
}

/*
 - regmatch - main matching routine
 *
 * Conceptually the strategy is simple:	 check to see whether the current
 * node matches, call self recursively to see whether the rest matches,
 * and then act accordingly.  In practice we make some effort to avoid
 * recursion, in particular by going through "ordinary" nodes (that don't
 * need to know whether the rest of the match failed) by a loop instead of
 * by recursion.
 */
static int			/* 0 failure, 1 success */
regmatch(prog)
char *prog;
{
	register char *scan;	/* Current node. */
	char *next;		/* Next node. */
	extern char *strchr();

	scan = prog;
	while (scan != NULL) {
		next = regnext(scan);

		switch (OP(scan)) {
		case BOL:
			if (reginput != regbol)
				return(0);
			break;
		case EOL:
			if (*reginput != '\0')
				return(0);
			break;
		case ANY:
			if (*reginput == '\0')
				return(0);
			reginput++;
			break;
		case EXACTLY: {
				register int len;
				register char *opnd;

				opnd = OPERAND(scan);
				/* Inline the first character, for speed. */
				if (*opnd != *reginput)
					return(0);
				len = strlen(opnd);
				if (len > 1 && strncmp(opnd, reginput, len) != 0)
					return(0);
				reginput += len;
			}
			break;
		case ANYOF:
			if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL)
				return(0);
			reginput++;
			break;
		case ANYBUT:
			if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL)
				return(0);
			reginput++;
			break;
		case NOTHING:
			break;
		case BACK:
			break;
		case OPEN+1:
		case OPEN+2:
		case OPEN+3:
		case OPEN+4:
		case OPEN+5:
		case OPEN+6:
		case OPEN+7:
		case OPEN+8:
		case OPEN+9: {
				register int no;
				register char *save;

				no = OP(scan) - OPEN;
				save = reginput;

				if (regmatch(next)) {
					/*
					 * Don't set startp if some later
					 * invocation of the same parentheses
					 * already has.
					 */
					if (regstartp[no] == NULL)
						regstartp[no] = save;
					return(1);
				} else
					return(0);
			}
			break;
		case CLOSE+1:
		case CLOSE+2:
		case CLOSE+3:
		case CLOSE+4:
		case CLOSE+5:
		case CLOSE+6:
		case CLOSE+7:
		case CLOSE+8:
		case CLOSE+9: {
				register int no;
				register char *save;

				no = OP(scan) - CLOSE;
				save = reginput;

				if (regmatch(next)) {
					/*
					 * Don't set endp if some later
					 * invocation of the same parentheses
					 * already has.
					 */
					if (regendp[no] == NULL)
						regendp[no] = save;
					return(1);
				} else
					return(0);
			}
			break;
		case BRANCH: {
				register char *save;

				if (OP(next) != BRANCH)		/* No choice. */
					next = OPERAND(scan);	/* Avoid recursion. */
				else {
					do {
						save = reginput;
						if (regmatch(OPERAND(scan)))
							return(1);
						reginput = save;
						scan = regnext(scan);
					} while (scan != NULL && OP(scan) == BRANCH);
					return(0);
					/* NOTREACHED */
				}
			}
			break;
		case STAR:
		case PLUS: {
				register char nextch;
				register int no;
				register char *save;
				register int min;

				/*
				 * Lookahead to avoid useless match attempts
				 * when we know what character comes next.
				 */
				nextch = '\0';
				if (OP(next) == EXACTLY)
					nextch = *OPERAND(next);
				min = (OP(scan) == STAR) ? 0 : 1;
				save = reginput;
				no = regrepeat(OPERAND(scan));
				while (no >= min) {
					/* If it could work, try it. */
					if (nextch == '\0' || *reginput == nextch)
						if (regmatch(next))
							return(1);
					/* Couldn't or didn't -- back up. */
					no--;
					reginput = save + no;
				}
				return(0);
			}
			break;
		case END:
			return(1);	/* Success! */
			break;
		default:
			regerror("memory corruption");
			return(0);
			break;
		}

		scan = next;
	}

	/*
	 * We get here only if there's trouble -- normally "case END" is
	 * the terminating point.
	 */
	regerror("corrupted pointers");
	return(0);
}

/*
 - regrepeat - repeatedly match something simple, report how many
 */
static int
regrepeat(p)
char *p;
{
	register int count = 0;
	register char *scan;
	register char *opnd;

	scan = reginput;
	opnd = OPERAND(p);
	switch (OP(p)) {
	case ANY:
		count = strlen(scan);
		scan += count;
		break;
	case EXACTLY:
		while (*opnd == *scan) {
			count++;
			scan++;
		}
		break;
	case ANYOF:
		while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
			count++;
			scan++;
		}
		break;
	case ANYBUT:
		while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
			count++;
			scan++;
		}
		break;
	default:		/* Oh dear.  Called inappropriately. */
		regerror("internal foulup");
		count = 0;	/* Best compromise. */
		break;
	}
	reginput = scan;

	return(count);
}

/*
 - regnext - dig the "next" pointer out of a node
 */
static char *
regnext(p)
register char *p;
{
	register int offset;

	if (p == &regdummy)
		return(NULL);

	offset = NEXT(p);
	if (offset == 0)
		return(NULL);

	if (OP(p) == BACK)
		return(p-offset);
	else
		return(p+offset);
}

@1.1log@Initial revision@text@d27 1a27 1/* $Id$ */@

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费视频国产在线观看| 亚洲欧洲另类国产综合| 亚洲第一电影网| 91视频com| 亚洲视频一区在线观看| 99久久亚洲一区二区三区青草 | 欧美精品视频www在线观看 | 91在线看国产| 亚洲欧洲日韩一区二区三区| 粉嫩av一区二区三区| 欧美韩国日本一区| 成人av在线播放网站| 国产精品蜜臀av| 99久久久精品| 亚洲国产欧美日韩另类综合| 欧美日本韩国一区| 男女性色大片免费观看一区二区 | 一区二区三区在线免费观看| 97se亚洲国产综合自在线| 国产精品美女一区二区三区| 不卡的电影网站| 亚洲另类一区二区| 欧美日韩精品福利| 五月天丁香久久| 日韩欧美一二三四区| 国产真实乱子伦精品视频| 国产欧美日韩麻豆91| 成人av电影免费在线播放| 亚洲欧洲av在线| 欧美无人高清视频在线观看| 午夜国产不卡在线观看视频| 2024国产精品| 99麻豆久久久国产精品免费优播| 国产精品欧美极品| 99re免费视频精品全部| 亚洲va在线va天堂| 久久久久久久电影| 97se狠狠狠综合亚洲狠狠| 丝袜美腿亚洲一区| 国产日韩欧美精品在线| 欧美在线视频日韩| 久久成人久久鬼色| 亚洲精品中文字幕乱码三区| 欧美男女性生活在线直播观看| 蜜桃在线一区二区三区| 国产精品视频九色porn| 欧美精品在线视频| 成人午夜av电影| 亚洲午夜精品17c| 国产午夜久久久久| 欧美日韩一区二区在线视频| 国产伦精品一区二区三区视频青涩| 中文字幕一区二区三区四区不卡 | 中文字幕在线一区免费| 91在线视频观看| 蜜桃视频一区二区三区在线观看| 午夜精品福利在线| 国产精品嫩草99a| 成人午夜精品在线| 一区二区三区四区不卡在线 | 亚洲成在线观看| 欧美激情一区二区三区不卡| 欧美日韩综合在线| 高清视频一区二区| 经典三级在线一区| 亚洲猫色日本管| 精品国产凹凸成av人网站| 一本色道久久综合亚洲aⅴ蜜桃| 久久99精品一区二区三区| 亚洲国产综合在线| 国产精品盗摄一区二区三区| 久久青草国产手机看片福利盒子 | 欧美视频日韩视频在线观看| 国产一区亚洲一区| 日本免费新一区视频| 亚洲乱码国产乱码精品精98午夜 | 91视频在线看| 国产91综合一区在线观看| 亚洲图片欧美色图| 中文字幕一区二区三区在线观看| 精品电影一区二区三区| 在线播放日韩导航| 欧美在线免费视屏| 色噜噜狠狠一区二区三区果冻| www.亚洲人| 国产成人av电影| 免费看欧美女人艹b| 日韩av不卡在线观看| 午夜精品视频一区| 偷拍自拍另类欧美| 日本不卡的三区四区五区| 亚洲黄网站在线观看| 伊人性伊人情综合网| 亚洲日本va午夜在线电影| 中文字幕一区二区三区乱码在线 | 亚洲一区二区精品视频| 夜夜操天天操亚洲| 亚洲制服丝袜av| 亚洲综合一二三区| 亚洲国产一二三| 日韩中文字幕不卡| 日本系列欧美系列| 激情偷乱视频一区二区三区| 国内久久精品视频| 成人网页在线观看| 色美美综合视频| 91福利在线播放| 欧美伦理视频网站| 精品国产亚洲在线| 国产欧美日本一区二区三区| 中文字幕在线免费不卡| 亚洲精品国产一区二区精华液| 亚洲一区二区三区国产| 亚洲国产精品综合小说图片区| 亚洲精品亚洲人成人网| 婷婷综合五月天| 国产一区二区三区高清播放| 成人黄页在线观看| 日本福利一区二区| 日韩一级片在线播放| 亚洲精品一线二线三线无人区| 国产亚洲精品超碰| 自拍偷拍欧美精品| 日韩高清一区二区| 国产精品911| 色综合久久综合| 欧美妇女性影城| 久久日一线二线三线suv| 国产精品久久久久婷婷| 亚洲小说春色综合另类电影| 久久成人av少妇免费| 国产精品亚洲午夜一区二区三区| 91色视频在线| 国产女主播视频一区二区| 性感美女久久精品| 播五月开心婷婷综合| 日韩一区二区三区在线| 一区二区欧美在线观看| 成人中文字幕合集| 日韩三级精品电影久久久| 亚洲自拍偷拍欧美| 99久久精品国产一区二区三区 | 欧美性生活久久| 国产精品欧美一区喷水| 毛片av一区二区| 欧美人与z0zoxxxx视频| 亚洲欧美在线观看| 成人国产一区二区三区精品| 欧美一区二区三区影视| 悠悠色在线精品| 东方欧美亚洲色图在线| xnxx国产精品| 久久国产夜色精品鲁鲁99| 欧美色精品在线视频| 亚洲精品欧美激情| 91麻豆精东视频| 亚洲天天做日日做天天谢日日欢 | 欧美三级午夜理伦三级中视频| 国产精品国产成人国产三级| 高清在线观看日韩| 国产日韩欧美精品一区| 国产福利一区二区三区视频| 精品粉嫩aⅴ一区二区三区四区| 91美女精品福利| 欧美国产日韩在线观看| 成人在线视频一区二区| 国产精品久久国产精麻豆99网站| 国产精品88av| 久久人人爽爽爽人久久久| 韩国女主播一区| 国产视频一区不卡| 国产一区二区按摩在线观看| 久久人人爽人人爽| 成人av手机在线观看| 最新日韩在线视频| 91久久精品网| 午夜a成v人精品| 精品久久久网站| 成人在线一区二区三区| 亚洲色图欧洲色图| 欧美网站一区二区| 美女一区二区视频| 久久精品夜色噜噜亚洲a∨| 高清免费成人av| 夜夜夜精品看看| 欧美理论电影在线| 九九国产精品视频| 国产精品高潮久久久久无| 欧美中文字幕一区二区三区| 免费观看91视频大全| 精品国产成人系列| 93久久精品日日躁夜夜躁欧美| 亚洲午夜电影在线| 久久综合狠狠综合| 91免费版pro下载短视频| 日本美女一区二区三区视频| 久久久久久免费网| 色噜噜偷拍精品综合在线| 日本大胆欧美人术艺术动态| 久久天堂av综合合色蜜桃网|