diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-09-26 20:53:39 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-09-26 20:53:39 +0000 |
commit | 8c922cd518cd36a281ce7cb57136ab3daff4af36 (patch) | |
tree | 3e941e108cbcb7ced11e67bd3d01c5e04dfa6283 /usr.bin/ssh/match.c | |
parent | 51e6206503f4e208e20bee340a0992c2dbccf1fa (diff) |
i bet a lot of people didn't know what ssh 1.2.16 had a nice license.
well, except for the patent issues. someone in sweden (forget their
name at the moment) cleaned out most of the patented code, and now
this code removes rsa code. when this is done, it will link against
libssl, but the work isn't completely done yet. then we need to bring
this up to modern days, featurewise.
Diffstat (limited to 'usr.bin/ssh/match.c')
-rw-r--r-- | usr.bin/ssh/match.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/usr.bin/ssh/match.c b/usr.bin/ssh/match.c new file mode 100644 index 00000000000..a5cab2877e4 --- /dev/null +++ b/usr.bin/ssh/match.c @@ -0,0 +1,78 @@ +/* + +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/09/26 20:53:36 deraadt 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*/ +} |