📄 match.c
字号:
then bad pattern */
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 + -