File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / thttpd / match.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:21:13 2012 UTC (12 years, 3 months ago) by misho
Branches: thttpd, MAIN
CVS tags: v2_25b, HEAD
thttpd

    1: /* match.c - simple shell-style filename matcher
    2: **
    3: ** Only does ? * and **, and multiple patterns separated by |.  Returns 1 or 0.
    4: **
    5: ** Copyright © 1995,2000 by Jef Poskanzer <jef@mail.acme.com>.
    6: ** All rights reserved.
    7: **
    8: ** Redistribution and use in source and binary forms, with or without
    9: ** modification, are permitted provided that the following conditions
   10: ** are met:
   11: ** 1. Redistributions of source code must retain the above copyright
   12: **    notice, this list of conditions and the following disclaimer.
   13: ** 2. Redistributions in binary form must reproduce the above copyright
   14: **    notice, this list of conditions and the following disclaimer in the
   15: **    documentation and/or other materials provided with the distribution.
   16: **
   17: ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18: ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19: ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20: ** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   21: ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22: ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23: ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24: ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25: ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26: ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27: ** SUCH DAMAGE.
   28: */
   29: 
   30: 
   31: #include <string.h>
   32: 
   33: #include "match.h"
   34: 
   35: static int match_one( const char* pattern, int patternlen, const char* string );
   36: 
   37: int
   38: match( const char* pattern, const char* string )
   39:     {
   40:     const char* or;
   41: 
   42:     for (;;)
   43: 	{
   44: 	or = strchr( pattern, '|' );
   45: 	if ( or == (char*) 0 )
   46: 	    return match_one( pattern, strlen( pattern ), string );
   47: 	if ( match_one( pattern, or - pattern, string ) )
   48: 	    return 1;
   49: 	pattern = or + 1;
   50: 	}
   51:     }
   52: 
   53: 
   54: static int
   55: match_one( const char* pattern, int patternlen, const char* string )
   56:     {
   57:     const char* p;
   58: 
   59:     for ( p = pattern; p - pattern < patternlen; ++p, ++string )
   60: 	{
   61: 	if ( *p == '?' && *string != '\0' )
   62: 	    continue;
   63: 	if ( *p == '*' )
   64: 	    {
   65: 	    int i, pl;
   66: 	    ++p;
   67: 	    if ( *p == '*' )
   68: 		{
   69: 		/* Double-wildcard matches anything. */
   70: 		++p;
   71: 		i = strlen( string );
   72: 		}
   73: 	    else
   74: 		/* Single-wildcard matches anything but slash. */
   75: 		i = strcspn( string, "/" );
   76: 	    pl = patternlen - ( p - pattern );
   77: 	    for ( ; i >= 0; --i )
   78: 		if ( match_one( p, pl, &(string[i]) ) )
   79: 		    return 1;
   80: 	    return 0;
   81: 	    }
   82: 	if ( *p != *string )
   83: 	    return 0;
   84: 	}
   85:     if ( *string == '\0' )
   86: 	return 1;
   87:     return 0;
   88:     }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>