/* match.c Author: Tatu Ylonen Copyright (c) 1995 Tatu Ylonen , 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$"); #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*/ }