1999-10-27 07:42:43 +04:00
|
|
|
/*
|
1999-11-24 16:26:21 +03:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
1999-10-27 07:42:43 +04:00
|
|
|
|
|
|
|
#include "includes.h"
|
1999-11-25 03:54:57 +03:00
|
|
|
RCSID("$Id: match.c,v 1.3 1999/11/25 00:54:59 damien Exp $");
|
1999-10-27 07:42:43 +04:00
|
|
|
|
|
|
|
#include "ssh.h"
|
|
|
|
|
1999-11-25 03:54:57 +03:00
|
|
|
/*
|
|
|
|
* Returns true if the given string matches the pattern (which may contain ?
|
|
|
|
* and * as wildcards), and zero if it does not match.
|
|
|
|
*/
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-24 16:26:21 +03:00
|
|
|
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;
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-24 16:26:21 +03:00
|
|
|
if (*pattern == '*') {
|
|
|
|
/* Skip the asterisk. */
|
|
|
|
pattern++;
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-24 16:26:21 +03:00
|
|
|
/* If at end of pattern, accept immediately. */
|
|
|
|
if (!*pattern)
|
|
|
|
return 1;
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-24 16:26:21 +03:00
|
|
|
/* If next character in pattern is known, optimize. */
|
|
|
|
if (*pattern != '?' && *pattern != '*') {
|
1999-11-25 03:54:57 +03:00
|
|
|
/*
|
|
|
|
* Look instances of the next character in
|
|
|
|
* pattern, and try to match starting from
|
|
|
|
* those.
|
|
|
|
*/
|
1999-11-24 16:26:21 +03:00
|
|
|
for (; *s; s++)
|
|
|
|
if (*s == *pattern &&
|
|
|
|
match_pattern(s + 1, pattern + 1))
|
|
|
|
return 1;
|
|
|
|
/* Failed. */
|
|
|
|
return 0;
|
|
|
|
}
|
1999-11-25 03:54:57 +03:00
|
|
|
/*
|
|
|
|
* Move ahead one character at a time and try to
|
|
|
|
* match at each position.
|
|
|
|
*/
|
1999-11-24 16:26:21 +03:00
|
|
|
for (; *s; s++)
|
|
|
|
if (match_pattern(s, pattern))
|
|
|
|
return 1;
|
|
|
|
/* Failed. */
|
|
|
|
return 0;
|
|
|
|
}
|
1999-11-25 03:54:57 +03:00
|
|
|
/*
|
|
|
|
* There must be at least one more character in the string.
|
|
|
|
* If we are at the end, fail.
|
|
|
|
*/
|
1999-11-24 16:26:21 +03:00
|
|
|
if (!*s)
|
|
|
|
return 0;
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-25 03:54:57 +03:00
|
|
|
/* Check if the next character of the string is acceptable. */
|
1999-11-24 16:26:21 +03:00
|
|
|
if (*pattern != '?' && *pattern != *s)
|
|
|
|
return 0;
|
1999-10-27 07:42:43 +04:00
|
|
|
|
1999-11-25 03:54:57 +03:00
|
|
|
/* Move to the next character, both in string and in pattern. */
|
1999-11-24 16:26:21 +03:00
|
|
|
s++;
|
|
|
|
pattern++;
|
|
|
|
}
|
|
|
|
/* NOTREACHED */
|
1999-10-27 07:42:43 +04:00
|
|
|
}
|