📄 match.c
字号:
if (range_end == '\0' || range_end == ']') return MATCH_PATTERN; /* special character range end */ if (range_end == '\\') { range_end = *++p; /* if end of text then we have a bad pattern */ if (!range_end) return MATCH_PATTERN; } /* move just beyond this range */ p++; } /* if the text character is in range then match found. make sure the range letters have the proper relationship to one another before comparison */ if (range_start < range_end) { if (*t >= range_start && *t <= range_end) { member_match = TRUE; loop = FALSE; } } else { if (*t >= range_end && *t <= range_start) { member_match = TRUE; loop = FALSE; } } } /* if there was a match in an exclusion set then no match */ /* if there was no match in a member set then no match */ if ((invert && member_match) || !(invert || member_match)) return MATCH_RANGE; /* if this is not an exclusion then skip the rest of the [...] construct that already matched. */ if (member_match) { while (*p != ']') { /* bad pattern (Missing ']') */ if (!*p) return MATCH_PATTERN; /* skip exact match */ if (*p == '\\') { p++; /* if end of text then we have a bad pattern */ if (!*p) return MATCH_PATTERN; } /* move to next pattern char */ p++; } } break; } case '\\': /* next character is quoted and must match exactly */ /* move pattern pointer to quoted char and fall through */ p++; /* if end of text then we have a bad pattern */ if (!*p) return MATCH_PATTERN; /* must match this character exactly */ default: if (*p != *t) return MATCH_LITERAL; } } /* if end of text not reached then the pattern fails */ if (*t) return MATCH_END; else return MATCH_VALID;}/*----------------------------------------------------------------------------** recursively call matche() with final segment of PATTERN and of TEXT.*----------------------------------------------------------------------------*/int matche_after_star (register char *p, register char *t){ register int match = 0; register nextp; /* pass over existing ? and * in pattern */ while ( *p == '?' || *p == '*' ) { /* take one char for each ? and + */ if (*p == '?') { /* if end of text then no match */ if (!*t++) return MATCH_ABORT; } /* move to next char in pattern */ p++; } /* if end of pattern we have matched regardless of text left */ if (!*p) return MATCH_VALID; /* get the next character to match which must be a literal or '[' */ nextp = *p; if (nextp == '\\') { nextp = p[1]; /* if end of text then we have a bad pattern */ if (!nextp) return MATCH_PATTERN; } /* Continue until we run out of text or definite result seen */ do { /* a precondition for matching is that the next character in the pattern match the next character in the text or that the next pattern char is the beginning of a range. Increment text pointer as we go here */ if (nextp == *t || nextp == '[') match = matche(p, t); /* if the end of text is reached then no match */ if (!*t++) match = MATCH_ABORT; } while ( match != MATCH_VALID && match != MATCH_ABORT && match != MATCH_PATTERN); /* return result */ return match;}/*----------------------------------------------------------------------------** match() is a shell to matche() to return only BOOLEAN values.*----------------------------------------------------------------------------*/BOOLEAN match( char *p, char *t ){ int error_type; error_type = matche(p,t); return (error_type == MATCH_VALID ) ? TRUE : FALSE;}#ifdef TEST/*** This test main expects as first arg the pattern and as second arg** the match string. Output is yea or nay on match. If nay on** match then the error code is parsed and written.*/#include <stdio.h>int main(int argc, char *argv[]){ int error; int is_valid_error; if (argc != 3) printf("Usage: MATCH Pattern Text\n"); else { printf("Pattern: %s\n", argv[1]); printf("Text : %s\n", argv[2]); if (!is_pattern(argv[1])) printf(" First Argument Is Not A Pattern\n"); else { error = matche(argv[1],argv[2]); is_valid_pattern(argv[1],&is_valid_error); switch (error) { case MATCH_VALID: printf(" Match Successful"); if (is_valid_error != PATTERN_VALID) printf(" -- is_valid_pattern() " "is complaining\n"); else printf("\n"); break; case MATCH_LITERAL: printf(" Match Failed on Literal\n"); break; case MATCH_RANGE: printf(" Match Failed on [..]\n"); break; case MATCH_ABORT: printf(" Match Failed on Early " "Text Termination\n"); break; case MATCH_END: printf(" Match Failed on Early " "Pattern Termination\n"); break; case MATCH_PATTERN: switch (is_valid_error) { case PATTERN_VALID: printf(" Internal Disagreement " "On Pattern\n"); break; case PATTERN_ESC: printf(" Literal Escape at " "End of Pattern\n"); break; case PATTERN_RANGE: printf(" No End of Range in " "[..] Construct\n"); break; case PATTERN_CLOSE: printf(" [..] Construct is Open\n"); break; case PATTERN_EMPTY: printf(" [..] Construct is Empty\n"); break; default: printf(" Internal Error in " "is_valid_pattern()\n"); } break; default: printf(" Internal Error in matche()\n"); break; } } } return(0);}#endif /* TEST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -