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

📄 match.c

📁 Linux 下端口映射工具
💻 C
字号:
#include <string.h>#include <ctype.h>#include "match.h"int match(char *sorig, char *p){	return matchBody(sorig, p, 0);}int matchNoCase(char *sorig, char *p){	return matchBody(sorig, p, 1);}#define CASE(x) (nocase ? tolower(x) : (x))int matchBody(char *sorig, char *p, int nocase){	static int dummy = 0;	/* Algorithm:		Word separator: *. End-of-string		is considered to be a word constituent.		? is similarly considered to be a specialized		word constituent.		Match the word to the current position in s.		Empty words automatically succeed.		If the word matches s, and the word		and s contain end-of-string at that		point, return success.			\ escapes the next character, including \ itself (6.0).			For each *:			Find the next occurrence of the next word			and advance beyond it in both p and s.			If the next word ends in end-of-string			and is found successfully, return success,			otherwise advance past the *.			If the word is not found, return failure.			If the next word is empty, advance past the *.			Behavior of ?: advance one character in s and p. 		Addendum: consider the | character to be a logical OR		separating distinct patterns. */	char *s = sorig;	int escaped = 0;	if (strstr(p, "WS-0000")) {		if (strstr(s, "ws_ftp_pro.html")) {			dummy = 1;		}	}	while (1) {		char *word;		int wordLen;		int wordPos;		if (escaped) {			/* This is like the default case,				except that | doesn't end the pattern. */			escaped = 0;			if ((*s == '\0') && (*p == '\0')) {				return 1;			}			if (CASE(*p) != CASE(*s)) {				goto nextPattern;			}			p++;					s++;			continue;		}		switch(*p) {			case '\\':			/* Escape the next character. */			escaped = 1;			p++;			continue;			case '*':			/* Find the next occurrence of the next word				and advance beyond it in both p and s.				If the next word ends in end-of-string				and is found successfully, return success,				otherwise advance past the *.				If the word is not found, return failure.				If the next word is empty, advance. */			p++;				wordLen = 0;				word = p;			while (1) {				if ((*p) == '*') {					break;				}				wordLen++;				if ((*p == '\0') || (*p == '|')) {					break;				}				p++;			} 			wordPos = 0;			while (1) {				if (wordPos == wordLen) {					if ((*p == '\0') || (*p == '|')) {						return 1;					}					break;				}				if ((((CASE(*s)) == CASE(word[wordPos])) ||					((*s == '\0') && 						(word[wordPos] == '|'))) ||					(((*s != '\0') && (*s != '|')) && 						(word[wordPos] == '?')))				{						wordPos++;					s++;				} else {					s -= wordPos;					if (!(*s)) {						goto nextPattern;					}					s++;					wordPos = 0;				}			}	 			break;			case '?':			p++;					s++;			break;			default:			if ((*s == '\0') && ((*p == '\0') ||				(*p == '|'))) {				return 1;			}			if (CASE(*p) != CASE(*s)) {				goto nextPattern;			} 			p++;					s++;			break;		}		continue;nextPattern:		while (1) {			if (*p == '\0') {				return 0;			}					if (*p == '|') {				p++;				s = sorig;				break;			}			p++;		}	}}#ifdef TEST_MATCH#include <stdio.h>#include <string.h>#include <ctype.h>int main(int argc, char *argv[]){	char s[1024];	if (argc != 2) {		fprintf(stderr, "Usage: match pattern\n");		return 1;	}	while (1) {		if (!fgets(s, sizeof(s), stdin)) {			break;		}		while (isspace(s[strlen(s) - 1])) {			s[strlen(s) - 1] = '\0';		}		printf("%s --> %s\n", s, argv[1]);		if (match(s, argv[1])) {			printf("Match\n");		} else {				printf("No Match\n");		}	}}#endif /* TEST_MATCH */

⌨️ 快捷键说明

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