[BACK]Return to match.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

File: [local] / src / usr.bin / ssh / match.c (download)

Revision 1.3, Wed Nov 24 00:26:02 1999 UTC (24 years, 6 months ago) by deraadt
Branch: MAIN
Changes since 1.2: +14 -14 lines

much more KNF

/*
 * 
 * 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/24 00:26:02 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)
{
	for (;;) {
		/* 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 */
}