]>
git.gir.st - ttxd.git/blob - src/thttpd-2.27/match.c
1 /* match.c - simple shell-style filename matcher
3 ** Only does ? * and **, and multiple patterns separated by |. Returns 1 or 0.
5 ** Copyright © 1995,2000 by Jef Poskanzer <jef@mail.acme.com>.
6 ** All rights reserved.
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions
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.
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
35 static int match_one( const char* pattern
, int patternlen
, const char* string
);
38 match( const char* pattern
, const char* string
)
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
) )
55 match_one( const char* pattern
, int patternlen
, const char* string
)
59 for ( p
= pattern
; p
- pattern
< patternlen
; ++p
, ++string
)
61 if ( *p
== '?' && *string
!= '\0' )
69 /* Double-wildcard matches anything. */
74 /* Single-wildcard matches anything but slash. */
75 i
= strcspn( string
, "/" );
76 pl
= patternlen
- ( p
- pattern
);
78 if ( match_one( p
, pl
, &(string
[i
]) ) )
85 if ( *string
== '\0' )