valid.c

来自「使用Modem发送网上传呼」· C语言 代码 · 共 127 行

C
127
字号
/*	-*- mode: c; mode: fold -*-	*/# include	"config.h"/*# undef		HAVE_REGEX_H*/# include	<stdlib.h># include	<string.h># include	"pager.h"# include	"valid.h"valid_t *v_new (char *pattern){	valid_t	*v;# if		! HAVE_REGEX_H		int	cnt, siz;	char	*ptr, *sav;	int	n;# endif		/* ! HAVE_REGEX_H */	if (v = (valid_t *) malloc (sizeof (valid_t))) {# if		HAVE_REGEX_H		if (regcomp (& v -> r, pattern, REG_EXTENDED)) {			free (v);			v = NULL;		}# else		/* HAVE_REGEX_H */		v -> pats = NULL;		v -> lens = NULL;		v -> malways = 0;		if (! strcmp (pattern, "-"))			v -> malways = 1;		else if (pattern = strdup (pattern)) {			cnt = 0;			siz = 0;			for (ptr = pattern; ptr; ) {				sav = ptr;				if (ptr = strchr (ptr, '|'))					*ptr++ = '\0';				if (cnt >= siz) {					siz += 4;					if (! (v -> pats = Realloc (v -> pats, (siz + 1) * sizeof (char *))))						break;				}				if (! (v -> pats[cnt] = strdup (sav))) {					while (--cnt >= 0)						free (v -> pats[cnt]);					free (v -> pats);					v -> pats = NULL;					break;				}				++cnt;			}			free (pattern);			if (v -> pats) {				v -> pats[cnt] = NULL;				if (! (v -> lens = (int *) malloc ((cnt + 1) * sizeof (int)))) {					for (n = 0; n < cnt; ++n)						free (v -> pats[n]);					free (v -> pats);					v -> pats = NULL;				} else					for (n = 0; n < cnt; ++n)						v -> lens[n] = strlen (v -> pats[n]);			}			if (! v -> pats) {				free (v);				v = NULL;			}		}# endif		/* HAVE_REGEX_H */	}	return v;}Boolv_alidate (valid_t *v, char *str, int *start, int *end){	Bool		ret = False;# if		HAVE_REGEX_H	regmatch_t	mt;		if (! regexec (& v -> r, str, 1, & mt, 0)) {		*start = mt.rm_so;		*end = mt.rm_eo;		ret = True;	}# else		/* HAVE_REGEX_H */	int	n;		if (v -> pats) {		for (n = 0; v -> pats[n]; ++n)			if (! strncmp (v -> pats[n], str, v -> lens[n]))				break;		if (v -> pats[n]) {			*start = 0;			*end = v -> lens[n];			ret = True;		}	} else if (v -> malways) {		*start = 0;		*end = 0;		ret = True;	}# endif		/* HAVE_REGEX_H */	return ret;}voidv_free (valid_t *v){# if		HAVE_REGEX_H	regfree (& v -> r);# else		/* HAVE_REGEX_H */	int	n;		if (v -> pats) {		for (n = 0; v -> pats[n]; ++n)			free (v -> pats[n]);		free (v -> pats);	}	if (v -> lens) {		free (v -> lens);		v -> lens = NULL;	}# endif		/* HAVE_REGEX_H */	free (v);}

⌨️ 快捷键说明

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