| /* |
| |
| 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 $"); |
| |
| #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++; |
| |
| /* If at end of pattern, accept immediately. */ |
| if (!*pattern) |
| return 1; |
| |
| /* 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; |
| |
| /* 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*/ |
| } |