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

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

?? regexp.c

?? 使用BorlandC++4.5編譯的一個MUD客戶端程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
head	2.1;access;symbols;locks; strict;comment	@ * @;2.1date	95.10.24.15.46.14;	author tsurace;	state Release;branches;next	1.1;1.1date	95.10.12.19.55.01;	author tsurace;	state Beta;branches;next	;desc@Regular expression routines.@2.1log@Roll.@text@/*
 * regcomp and regexec -- regsub and regerror are elsewhere
 * @@(#)regexp.c 1.3 of 18 April 87
 *
 *	Copyright (c) 1986 by University of Toronto.
 *	Written by Henry Spencer.  Not derived from licensed software.
 *
 *	Permission is granted to anyone to use this software for any
 *	purpose on any computer system, and to redistribute it freely,
 *	subject to the following restrictions:
 *
 *	1. The author is not responsible for the consequences of use of
 *		this software, no matter how awful, even if they arise
 *		from defects in it.
 *
 *	2. The origin of this software must not be misrepresented, either
 *		by explicit claim or by omission.
 *
 *	3. Altered versions must be plainly marked as such, and must not
 *		be misrepresented as being the original software.
 *
 * Beware that some of this code is subtly aware of the way operator
 * precedence is structured in regular expressions.  Serious changes in
 * regular-expression syntax might require a total rethink.
 */
/* This is an altered version -- Greg Hudson */
/* $Id: regexp.c 1.1 1995/10/12 19:55:01 tsurace Beta tsurace $ */

#include <stdio.h>
#include "vt.h"
#include "regmagic.h"
#undef min

/*
 * The "internal use only" fields in regexp.h are present to pass info from
 * compile to execute that permits the execute phase to run lots faster on
 * simple cases.  They are:
 *
 * regstart	char that must begin a match; '\0' if none obvious
 * reganch	is the match anchored (at beginning-of-line only)?
 * regmust	string (pointer into program) that match must include, or NULL
 * regmlen	length of regmust string
 *
 * Regstart and reganch permit very fast decisions on suitable starting points
 * for a match, cutting down the work a lot.  Regmust permits fast rejection
 * of lines that cannot possibly match.	 The regmust tests are costly enough
 * that regcomp() supplies a regmust only if the r.e. contains something
 * potentially expensive (at present, the only such thing detected is * or +
 * at the start of the r.e., which can involve a lot of backup).  Regmlen is
 * supplied because the test in regexec() needs it and regcomp() is computing
 * it anyway.
 */

/*
 * Structure for regexp "program".  This is essentially a linear encoding
 * of a nondeterministic finite-state machine (aka syntax charts or
 * "railroad normal form" in parsing technology).  Each node is an opcode
 * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
 * all nodes except BRANCH implement concatenation; a "next" pointer with
 * a BRANCH on both ends of it is connecting two alternatives.	(Here we
 * have one of the subtle syntax dependencies:	an individual BRANCH (as
 * opposed to a collection of them) is never concatenated with anything
 * because of operator precedence.)  The operand of some types of node is
 * a literal string; for others, it is a node leading into a sub-FSM.  In
 * particular, the operand of a BRANCH node is the first node of the branch.
 * (NB this is *not* a tree structure:	the tail of the branch connects
 * to the thing following the set of BRANCHes.)	 The opcodes are:
 */

/* definition	number	opnd?	meaning */
#define END	0	/* no	End of program. */
#define BOL	1	/* no	Match "" at beginning of line. */
#define EOL	2	/* no	Match "" at end of line. */
#define ANY	3	/* no	Match any one character. */
#define ANYOF	4	/* str	Match any character in this string. */
#define ANYBUT	5	/* str	Match any character not in this string. */
#define BRANCH	6	/* node Match this alternative, or the next... */
#define BACK	7	/* no	Match "", "next" ptr points backward. */
#define EXACTLY 8	/* str	Match this string. */
#define NOTHING 9	/* no	Match empty string. */
#define STAR	10	/* node Match this (simple) thing 0 or more times. */
#define PLUS	11	/* node Match this (simple) thing 1 or more times. */
#define OPEN	20	/* no	Mark this point in input as start of #n. */
			/*	OPEN+1 is number 1, etc. */
#define CLOSE	30	/* no	Analogous to OPEN. */

/*
 * Opcode notes:
 *
 * BRANCH	The set of branches constituting a single choice are hooked
 *		together with their "next" pointers, since precedence prevents
 *		anything being concatenated to any individual branch.  The
 *		"next" pointer of the last BRANCH in a choice points to the
 *		thing following the whole choice.  This is also where the
 *		final "next" pointer of each individual branch points; each
 *		branch starts with the operand node of a BRANCH node.
 *
 * BACK		Normal "next" pointers all implicitly point forward; BACK
 *		exists to make loop structures possible.
 *
 * STAR,PLUS	'?', and complex '*' and '+', are implemented as circular
 *		BRANCH structures using BACK.  Simple cases (one character
 *		per match) are implemented with STAR and PLUS for speed
 *		and to minimize recursive plunges.
 *
 * OPEN,CLOSE	...are numbered at compile time.
 */

/*
 * A node is one char of opcode followed by two chars of "next" pointer.
 * "Next" pointers are stored as two 8-bit pieces, high order first.  The
 * value is a positive offset from the opcode of the node containing it.
 * An operand, if any, simply follows the node.	 (Note that much of the
 * code generation knows about this implicit relationship.)
 *
 * Using two bytes for the "next" pointer is vast overkill for most things,
 * but allows patterns to get big without disasters.
 */
#define OP(p)	(*(p))
#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
#define OPERAND(p)	((p) + 3)

/*
 * See regmagic.h for one further detail of program structure.
 */


/*
 * Utility definitions.
 */
#ifndef CHARBITS
#define UCHARAT(p)	((int)*(unsigned char *)(p))
#else
#define UCHARAT(p)	((int)*(p)&CHARBITS)
#endif

#define FAIL(m) { regerror(m); return(NULL); }
#define ISMULT(c)	((c) == '*' || (c) == '+' || (c) == '?')
#define META	"^$.[()|?+*\\"

/*
 * Flags to be passed up and down.
 */
#define HASWIDTH	01	/* Known never to match null string. */
#define SIMPLE		02	/* Simple enough to be STAR/PLUS operand. */
#define SPSTART		04	/* Starts with * or +. */
#define WORST		0	/* Worst case. */

/*
 * Global work variables for regcomp().
 */
static char *regparse;		/* Input-scan pointer. */
static int regnpar;		/* () count. */
static char regdummy;
static char *regcode;		/* Code-emit pointer; &regdummy = don't. */
static long regsize;		/* Code size. */

/*
 * Forward declarations for regcomp()'s friends.
 */
#ifdef PROTOTYPES
static char *reg(int, int *);
static char *regbranch(int *);
static char *regpiece(int *);
static char *regatom(int *);
static char *regnode(char);
static char *regnext(char *);
static void regc(char);
static void reginsert(char, char *);
static void regtail(char *, char *);
static void regoptail(char *, char *);
#else
static char *reg();
static char *regbranch();
static char *regpiece();
static char *regatom();
static char *regnode();
static char *regnext();
static void regc();
static void reginsert();
static void regtail();
static void regoptail();
#endif

/*
 - regcomp - compile a regular expression into internal code
 *
 * We can't allocate space until we know how big the compiled form will be,
 * but we can't compile it (and thus know how big it is) until we've got a
 * place to put the code.  So we cheat:	 we compile it twice, once with code
 * generation turned off and size counting turned on, and once "for real".
 * This also means that we don't allocate space until we are sure that the
 * thing really will compile successfully, and we never have to move the
 * code and thus invalidate pointers into it.  (Note that it has to be in
 * one piece because free() must be able to free it all.)
 *
 * Beware that the optimization-preparation code in here knows about some
 * of the structure of the compiled regexp.
 */
regexp *
regcomp(exp)
char *exp;
{
	register regexp *r;
	register char *scan;
	register char *longest;
	register int len;
	int flags;

	if (exp == NULL)
		FAIL("NULL argument");

	/* First pass: determine size, legality. */
	regparse = exp;
	regnpar = 1;
	regsize = 0L;
	regcode = &regdummy;
	regc(MAGIC);
	if (reg(0, &flags) == NULL)
		return(NULL);

	/* Small enough for pointer-storage convention? */
	if (regsize >= 32767L)		/* Probably could be 65535L. */
		FAIL("regexp too big");

	/* Allocate space. */
	r = (regexp *) malloc(sizeof(regexp) + (unsigned)regsize);
	if (!r)
		FAIL("not enough memory");

	/* Second pass: emit code. */
	regparse = exp;
	regnpar = 1;
	regcode = r->program;
	regc(MAGIC);
	if (reg(0, &flags) == NULL)
		return(NULL);

	/* Dig out information for optimizations. */
	r->regstart = '\0';	/* Worst-case defaults. */
	r->reganch = 0;
	r->regmust = NULL;
	r->regmlen = 0;
	scan = r->program+1;			/* First BRANCH. */
	if (OP(regnext(scan)) == END) {		/* Only one top-level choice. */
		scan = OPERAND(scan);

		/* Starting-point info. */
		if (OP(scan) == EXACTLY)
			r->regstart = *OPERAND(scan);
		else if (OP(scan) == BOL)
			r->reganch++;

		/*
		 * If there's something expensive in the r.e., find the
		 * longest literal string that must appear and make it the
		 * regmust.  Resolve ties in favor of later strings, since
		 * the regstart check works with the beginning of the r.e.
		 * and avoiding duplication strengthens checking.  Not a
		 * strong reason, but sufficient in the absence of others.
		 */
		if (flags&SPSTART) {
			longest = NULL;
			len = 0;
			for (; scan != NULL; scan = regnext(scan))
				if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
					longest = OPERAND(scan);
					len = strlen(OPERAND(scan));
				}
			r->regmust = longest;
			r->regmlen = len;
		}
	}

	return(r);
}

/*
 - reg - regular expression, i.e. main body or parenthesized thing
 *
 * Caller must absorb opening parenthesis.
 *
 * Combining parenthesis handling with the base level of regular expression
 * is a trifle forced, but the need to tie the tails of the branches to what
 * follows makes it hard to avoid.
 */
static char *
reg(paren, flagp)
int paren;			/* Parenthesized? */
int *flagp;
{
	register char *ret;
	register char *br;
	register char *ender;
	register int parno;
	int flags;

	*flagp = HASWIDTH;	/* Tentatively. */

	/* Make an OPEN node, if parenthesized. */
	if (paren) {
		if (regnpar >= NSUBEXP)
			FAIL("too many ()");
		parno = regnpar;
		regnpar++;
		ret = regnode(OPEN+parno);
	} else
		ret = NULL;

	/* Pick up the branches, linking them together. */
	br = regbranch(&flags);
	if (br == NULL)
		return(NULL);
	if (ret != NULL)
		regtail(ret, br);	/* OPEN -> first. */
	else
		ret = br;
	if (!(flags&HASWIDTH))
		*flagp &= ~HASWIDTH;
	*flagp |= flags&SPSTART;
	while (*regparse == '|') {
		regparse++;
		br = regbranch(&flags);
		if (br == NULL)
			return(NULL);
		regtail(ret, br);	/* BRANCH -> BRANCH. */
		if (!(flags&HASWIDTH))
			*flagp &= ~HASWIDTH;
		*flagp |= flags&SPSTART;
	}

	/* Make a closing node, and hook it on the end. */
	ender = regnode((paren) ? CLOSE+parno : END);	
	regtail(ret, ender);

	/* Hook the tails of the branches to the closing node. */
	for (br = ret; br != NULL; br = regnext(br))
		regoptail(br, ender);

	/* Check for proper termination. */
	if (paren && *regparse++ != ')') {
		FAIL("unmatched ()");
	} else if (!paren && *regparse != '\0') {
		if (*regparse == ')') {
			FAIL("unmatched ()");
		} else
			FAIL("junk on end");	/* "Can't happen". */
		/* NOTREACHED */
	}

	return(ret);
}

/*
 - regbranch - one alternative of an | operator
 *
 * Implements the concatenation operator.
 */
static char *
regbranch(flagp)
int *flagp;
{
	register char *ret;
	register char *chain;
	register char *latest;
	int flags;

	*flagp = WORST;		/* Tentatively. */

	ret = regnode(BRANCH);
	chain = NULL;
	while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
		latest = regpiece(&flags);
		if (latest == NULL)
			return(NULL);
		*flagp |= flags&HASWIDTH;
		if (chain == NULL)	/* First piece. */
			*flagp |= flags&SPSTART;
		else
			regtail(chain, latest);
		chain = latest;
	}
	if (chain == NULL)	/* Loop ran zero times. */
	(void) regnode(NOTHING);

	return(ret);
}

/*
 - regpiece - something followed by possible [*+?]
 *
 * Note that the branching code sequences used for ? and the general cases
 * of * and + are somewhat optimized:  they use the same NOTHING node as
 * both the endmarker for their branch list and the body of the last branch.
 * It might seem that this node could be dispensed with entirely, but the
 * endmarker role is not redundant.
 */
static char *
regpiece(flagp)
int *flagp;
{
	register char *ret;
	register char op;
	register char *next;
	int flags;

	ret = regatom(&flags);
	if (ret == NULL)
		return(NULL);

	op = *regparse;
	if (!ISMULT(op)) {
		*flagp = flags;
		return(ret);
	}

	if (!(flags&HASWIDTH) && op != '?')
		FAIL("*+ operand could be empty");
	*flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);

	if (op == '*' && (flags&SIMPLE))
		reginsert(STAR, ret);
	else if (op == '*') {
		/* Emit x* as (x&|), where & means "self". */
		reginsert(BRANCH, ret);			/* Either x */
		regoptail(ret, regnode(BACK));		/* and loop */
		regoptail(ret, ret);			/* back */
		regtail(ret, regnode(BRANCH));		/* or */
		regtail(ret, regnode(NOTHING));		/* null. */
	} else if (op == '+' && (flags&SIMPLE))
		reginsert(PLUS, ret);
	else if (op == '+') {
		/* Emit x+ as x(&|), where & means "self". */
		next = regnode(BRANCH);			/* Either */
		regtail(ret, next);
		regtail(regnode(BACK), ret);		/* loop back */
		regtail(next, regnode(BRANCH));		/* or */
		regtail(ret, regnode(NOTHING));		/* null. */
	} else if (op == '?') {
		/* Emit x? as (x|) */
		reginsert(BRANCH, ret);			/* Either x */
		regtail(ret, regnode(BRANCH));		/* or */
		next = regnode(NOTHING);		/* null. */
		regtail(ret, next);
		regoptail(ret, next);
	}
	regparse++;
	if (ISMULT(*regparse))
		FAIL("nested *?+");

	return(ret);
}

/*
 - regatom - the lowest level
 *
 * Optimization:  gobbles an entire sequence of ordinary characters so that
 * it can turn them into a single node, which is smaller to store and
 * faster to run.  Backslashed characters are exceptions, each becoming a
 * separate node; the code is simpler that way and it's not worth fixing.
 */
static char *
regatom(flagp)
int *flagp;
{
	register char *ret;
	int flags;

	*flagp = WORST;		/* Tentatively. */

	switch (*regparse++) {
	case '^':
		ret = regnode(BOL);
		break;
	case '$':
		ret = regnode(EOL);
		break;
	case '.':
		ret = regnode(ANY);
		*flagp |= HASWIDTH|SIMPLE;
		break;
	case '[': {
			register int class;
			register int classend;

			if (*regparse == '^') { /* Complement of range. */
				ret = regnode(ANYBUT);
				regparse++;
			} else
				ret = regnode(ANYOF);
			if (*regparse == ']' || *regparse == '-')
				regc(*regparse++);
			while (*regparse != '\0' && *regparse != ']') {
				if (*regparse == '-') {
					regparse++;
					if (*regparse == ']' || *regparse == '\0')
						regc('-');
					else {
						class = UCHARAT(regparse-2)+1;
						classend = UCHARAT(regparse);
						if (class > classend+1)
							FAIL("invalid [] range");
						for (; class <= classend; class++)
							regc(class);
						regparse++;
					}
				} else
					regc(*regparse++);
			}
			regc('\0');
			if (*regparse != ']')
				FAIL("unmatched []");
			regparse++;
			*flagp |= HASWIDTH|SIMPLE;
		}
		break;
	case '(':
		ret = reg(1, &flags);
		if (ret == NULL)
			return(NULL);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品99久久久| 18涩涩午夜精品.www| 日韩和的一区二区| 欧美日韩1234| 久久国内精品视频| 久久夜色精品国产欧美乱极品| 国产成人在线免费| 中文字幕亚洲成人| 欧美年轻男男videosbes| 舔着乳尖日韩一区| 国产嫩草影院久久久久| 91豆麻精品91久久久久久| 日韩制服丝袜先锋影音| 欧美精品一区二区精品网| 成人免费视频一区| 亚洲一区免费在线观看| 精品国产91洋老外米糕| 91片在线免费观看| 另类小说图片综合网| 国产精品乱子久久久久| 欧美色爱综合网| 国产九九视频一区二区三区| 中文字幕一区在线观看视频| 欧美日韩视频专区在线播放| 国产一区二区免费看| 亚洲欧美一区二区在线观看| 欧美一级片在线| 成人av免费网站| 日韩福利视频导航| 中文字幕亚洲成人| 精品精品国产高清一毛片一天堂| 99re这里只有精品首页| 免费成人在线观看| 亚洲精品ww久久久久久p站| 欧美成人一区二区三区在线观看| 91免费国产在线观看| 精品一区二区精品| 亚洲影视在线观看| 欧美激情中文字幕| 日韩一区二区在线看| av爱爱亚洲一区| 国产专区综合网| 日日夜夜精品免费视频| 日韩一区欧美小说| 国产三级欧美三级日产三级99 | 麻豆精品在线播放| 亚洲人xxxx| 久久久久久久久久美女| 91精品久久久久久久久99蜜臂| va亚洲va日韩不卡在线观看| 国产精品综合av一区二区国产馆| 亚洲午夜久久久久久久久电影院| 国产精品天干天干在线综合| 欧美xxxxxxxxx| 欧美日韩国产不卡| 在线欧美日韩国产| av综合在线播放| 成人高清视频在线| 国产成人精品在线看| 久久精品国产99久久6| 午夜在线成人av| 亚洲最大成人综合| 一区免费观看视频| 亚洲欧美在线aaa| 中文字幕一区二区三区不卡在线| 国产视频亚洲色图| 久久久久久一二三区| 久久久综合九色合综国产精品| 一区二区三区免费在线观看| 国产精品人成在线观看免费| 久久久久久久av麻豆果冻| 日韩欧美你懂的| 欧美一级日韩一级| 日韩精品在线一区| 欧美精品一区二区三区蜜桃| 久久亚洲春色中文字幕久久久| 日韩美女主播在线视频一区二区三区| 制服丝袜亚洲精品中文字幕| 欧美日韩国产系列| 欧美电影在线免费观看| 88在线观看91蜜桃国自产| 欧美日韩免费观看一区二区三区| 欧美视频在线播放| 欧美日韩高清一区二区不卡| 欧美日韩电影在线| 555夜色666亚洲国产免| 欧美一区二区三区电影| 欧美一级日韩免费不卡| 久久综合色婷婷| 中文字幕欧美激情一区| 亚洲精品国久久99热| 亚洲综合网站在线观看| 日韩成人一级大片| 精品一区二区三区av| 成人午夜精品一区二区三区| 99视频精品全部免费在线| 中文在线免费一区三区高中清不卡| 国产欧美一区二区精品性| 亚洲欧洲色图综合| 午夜一区二区三区视频| 久久精品国产99国产| 国产成人免费视频网站| 一本久久a久久精品亚洲| 欧美日韩在线播放一区| 日韩亚洲欧美中文三级| 欧美国产综合色视频| 亚洲精选免费视频| 免费观看日韩电影| av在线不卡免费看| 欧美老肥妇做.爰bbww视频| 精品电影一区二区三区| 亚洲婷婷在线视频| 天堂va蜜桃一区二区三区 | 精品国产免费一区二区三区香蕉| 久久久久国产精品人| 亚洲欧美乱综合| 美女国产一区二区| 91麻豆福利精品推荐| 日韩欧美黄色影院| 亚洲老司机在线| 国产一区二区三区在线观看免费视频| 色视频一区二区| 久久精品欧美日韩| 亚洲不卡在线观看| 成人久久久精品乱码一区二区三区| 欧美丝袜第三区| 国产精品对白交换视频| 蜜臀av一区二区在线观看 | 免费在线看成人av| 色婷婷av一区| 国产欧美日韩亚州综合| 天堂精品中文字幕在线| 日本久久电影网| 国产情人综合久久777777| 日韩影院精彩在线| 日本韩国精品在线| 国产欧美日本一区二区三区| 日本不卡中文字幕| 色噜噜久久综合| 中文无字幕一区二区三区| 日韩av电影一区| 欧美性生活久久| 椎名由奈av一区二区三区| 国产精品911| 久久丝袜美腿综合| 久久国内精品视频| 91麻豆精品国产91久久久更新时间 | xf在线a精品一区二区视频网站| 亚洲综合无码一区二区| 色综合久久久久综合| 国产日韩欧美精品电影三级在线| 狠狠色狠狠色综合日日91app| 欧美丰满少妇xxxbbb| 亚洲一二三四在线观看| 色婷婷激情久久| 亚洲免费在线看| 91一区一区三区| 国产精品久久精品日日| 国产大陆精品国产| 欧美国产日韩在线观看| 国产精品一区二区三区四区| 久久老女人爱爱| 国产一级精品在线| 久久久九九九九| 国产成人av一区二区三区在线| 亚洲精品一区二区三区四区高清 | 国产精品久久久久久久久晋中| 国产美女一区二区三区| 久久久久久亚洲综合影院红桃| 激情欧美一区二区| 久久影音资源网| 国产精品一区二区在线播放 | 国内精品免费**视频| 欧美成人vps| 国产精品一区二区三区四区| 国产日韩欧美综合一区| 91在线视频播放| 一区二区三区四区国产精品| 91国在线观看| 婷婷久久综合九色综合绿巨人| 日韩一区二区三区电影在线观看| 美女视频一区在线观看| 久久综合久色欧美综合狠狠| 成人黄色小视频| 一区二区三区电影在线播| 欧美三级日韩在线| 久久成人免费电影| 国产精品家庭影院| 欧美日本在线播放| 久久99精品国产.久久久久久| 国产亚洲欧美在线| 日本道精品一区二区三区| 丝袜脚交一区二区| 国产欧美精品一区二区三区四区 | 国产在线观看免费一区| 国产精品久久久久一区二区三区| 欧美专区亚洲专区| 久久精品久久久精品美女| 国产欧美1区2区3区| 在线观看国产一区二区|