| /* |
| * |
| * 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.3 1999/11/25 00:54:59 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) |
| { |
| for (;;) { |
| /* If at end of pattern, accept if also at end of string. */ |
| if (!*pattern) |
| return !*s; |
| |
| 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 */ |
| } |