diff options
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 125 |
1 files changed, 62 insertions, 63 deletions
@@ -1,78 +1,77 @@ /* - -match.c - -Author: Tatu Ylonen <ylo@cs.hut.fi> - -Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland - All rights reserved - -Created: Thu Jun 22 01:17:50 1995 ylo - -Simple pattern matching, with '*' and '?' as wildcards. - -*/ + * + * match.c + * + * Author: Tatu Ylonen <ylo@cs.hut.fi> + * + * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland + * All rights reserved + * + * Created: Thu Jun 22 01:17:50 1995 ylo + * + * Simple pattern matching, with '*' and '?' as wildcards. + * + */ #include "includes.h" -RCSID("$Id: match.c,v 1.1 1999/10/27 03:42:44 damien Exp $"); +RCSID("$Id: match.c,v 1.2 1999/11/24 13:26:22 damien Exp $"); #include "ssh.h" /* Returns true if the given string matches the pattern (which may contain ? and * as wildcards), and zero if it does not match. */ - -int match_pattern(const char *s, const char *pattern) -{ - while (1) - { - /* If at end of pattern, accept if also at end of string. */ - if (!*pattern) - return !*s; - /* Process '*'. */ - if (*pattern == '*') - { - /* Skip the asterisk. */ - pattern++; +int +match_pattern(const char *s, const char *pattern) +{ + for (;;) { + /* If at end of pattern, accept if also at end of string. */ + if (!*pattern) + return !*s; - /* If at end of pattern, accept immediately. */ - if (!*pattern) - return 1; + /* Process '*'. */ + if (*pattern == '*') { + /* Skip the asterisk. */ + pattern++; - /* If next character in pattern is known, optimize. */ - if (*pattern != '?' && *pattern != '*') - { - /* Look instances of the next character in pattern, and try - to match starting from those. */ - for (; *s; s++) - if (*s == *pattern && - match_pattern(s + 1, pattern + 1)) - return 1; - /* Failed. */ - return 0; - } + /* If at end of pattern, accept immediately. */ + if (!*pattern) + return 1; - /* Move ahead one character at a time and try to match at each - position. */ - for (; *s; s++) - if (match_pattern(s, pattern)) - return 1; - /* Failed. */ - return 0; - } + /* If next character in pattern is known, optimize. */ + if (*pattern != '?' && *pattern != '*') { + /* Look instances of the next character in + pattern, and try to match starting from + those. */ + for (; *s; s++) + if (*s == *pattern && + match_pattern(s + 1, pattern + 1)) + return 1; + /* Failed. */ + return 0; + } + /* Move ahead one character at a time and try to + match at each position. */ + for (; *s; s++) + if (match_pattern(s, pattern)) + return 1; + /* Failed. */ + return 0; + } + /* There must be at least one more character in the + string. If we are at the end, fail. */ + if (!*s) + return 0; - /* There must be at least one more character in the string. If we are - at the end, fail. */ - if (!*s) - return 0; + /* Check if the next character of the string is + acceptable. */ + if (*pattern != '?' && *pattern != *s) + return 0; - /* Check if the next character of the string is acceptable. */ - if (*pattern != '?' && *pattern != *s) - return 0; - - /* Move to the next character, both in string and in pattern. */ - s++; - pattern++; - } - /*NOTREACHED*/ + /* Move to the next character, both in string and in + pattern. */ + s++; + pattern++; + } + /* NOTREACHED */ } |