| 
    
       /*
 
     | 
  
  
     | 
    
        Copyright (c) 2003, Dominik Reichl <dominik.reichl@t-online.de>
 
     | 
  
  
     | 
    
        All rights reserved.
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
        LICENSE TERMS
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
        Redistribution and use in source and binary forms, with or without
 
     | 
  
  
     | 
    
        modification, are permitted provided that the following conditions are met:
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
        * Redistributions of source code must retain the above copyright notice, this
 
     | 
  
  
     | 
    
          list of conditions and the following disclaimer.
 
     | 
  
  
     | 
    
        * Redistributions in binary form must reproduce the above copyright notice,
 
     | 
  
  
     | 
    
          this list of conditions and the following disclaimer in the documentation
 
     | 
  
  
     | 
    
          and/or other materials provided with the distribution.
 
     | 
  
  
     | 
    
        * Neither the name of ReichlSoft nor the names of its contributors may be used
 
     | 
  
  
     | 
    
          to endorse or promote products derived from this software without specific
 
     | 
  
  
     | 
    
          prior written permission.
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
        DISCLAIMER
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 
     | 
  
  
     | 
    
        AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
     | 
  
  
     | 
    
        IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
     | 
  
  
     | 
    
        DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 
     | 
  
  
     | 
    
        FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
     | 
  
  
     | 
    
        DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 
     | 
  
  
     | 
    
        SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 
     | 
  
  
     | 
    
        CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 
     | 
  
  
     | 
    
        OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
     | 
  
  
     | 
    
        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
     | 
  
  
     | 
    
       */
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       // Heavily modified version of the filename matching algorithm implementation
 
     | 
  
  
     | 
    
       // by David R. Tribble.
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       // Here's the original header:
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       /******************************************************************************
 
     | 
  
  
     | 
    
       * fpattern.h
 
     | 
  
  
     | 
    
       *	Functions for matching filename patterns to filenames.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       * Usage
 
     | 
  
  
     | 
    
       *	Filename patterns are composed of regular (printable) characters which
 
     | 
  
  
     | 
    
       *	may comprise a filename as well as special pattern matching characters:
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    .		Matches a period (.).
 
     | 
  
  
     | 
    
       *			Note that a period in a filename is not treated any
 
     | 
  
  
     | 
    
       *			differently than any other character.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    ?		Any.
 
     | 
  
  
     | 
    
       *			Matches any single character except '/' or '\'.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    *		Closure.
 
     | 
  
  
     | 
    
       *			Matches zero or more occurences of any characters other
 
     | 
  
  
     | 
    
       *			than '/' or '\'.
 
     | 
  
  
     | 
    
       *			Leading '*' characters are allowed.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    SUB		Substitute (^Z).
 
     | 
  
  
     | 
    
       *			Similar to '*', this matches zero or more occurences of
 
     | 
  
  
     | 
    
       *			any characters other than '/', '\', or '.'.
 
     | 
  
  
     | 
    
       *			Leading '^Z' characters are allowed.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    [ab]	Set.
 
     | 
  
  
     | 
    
       *			Matches the single character 'a' or 'b'.
 
     | 
  
  
     | 
    
       *			If the dash '-' character is to be included, it must
 
     | 
  
  
     | 
    
       *			immediately follow the opening bracket '['.
 
     | 
  
  
     | 
    
       *			If the closing bracket ']' character is to be included,
 
     | 
  
  
     | 
    
       *			it must be preceded by a quote '`'.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    [a-z]	Range.
 
     | 
  
  
     | 
    
       *			Matches a single character in the range 'a' to 'z'.
 
     | 
  
  
     | 
    
       *			Ranges and sets may be combined within the same set of
 
     | 
  
  
     | 
    
       *			brackets.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    [!R]	Exclusive range.
 
     | 
  
  
     | 
    
       *			Matches a single character not in the range 'R'.
 
     | 
  
  
     | 
    
       *			If range 'R' includes the dash '-' character, the dash
 
     | 
  
  
     | 
    
       *			must immediately follow the caret '!'.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    !		Not.
 
     | 
  
  
     | 
    
       *			Makes the following pattern (up to the next '/') match
 
     | 
  
  
     | 
    
       *			any filename except those what it would normally match.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    /		Path separator (UNIX and DOS).
 
     | 
  
  
     | 
    
       *			Matches a '/' or '\' pathname (directory) separator.
 
     | 
  
  
     | 
    
       *			Multiple separators are treated like a single
 
     | 
  
  
     | 
    
       *			separator.
 
     | 
  
  
     | 
    
       *			A leading separator indicates an absolute pathname.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    \		Path separator (DOS).
 
     | 
  
  
     | 
    
       *			Same as the '/' character.
 
     | 
  
  
     | 
    
       *			Note that this character must be escaped if used within
 
     | 
  
  
     | 
    
       *			string constants ("\\").
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    \		Quote (UNIX).
 
     | 
  
  
     | 
    
       *			Makes the next character a regular (nonspecial)
 
     | 
  
  
     | 
    
       *			character.
 
     | 
  
  
     | 
    
       *			Note that to match the quote character itself, it must
 
     | 
  
  
     | 
    
       *			be quoted.
 
     | 
  
  
     | 
    
       *			Note that this character must be escaped if used within
 
     | 
  
  
     | 
    
       *			string constants ("\\").
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    `		Quote (DOS).
 
     | 
  
  
     | 
    
       *			Makes the next character a regular (nonspecial)
 
     | 
  
  
     | 
    
       *			character.
 
     | 
  
  
     | 
    
       *			Note that to match the quote character itself, it must
 
     | 
  
  
     | 
    
       *			be quoted.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	Upper and lower case alphabetic characters are considered identical,
 
     | 
  
  
     | 
    
       *	i.e., 'a' and 'A' match each other.
 
     | 
  
  
     | 
    
       *	(What constitutes a lowercase letter depends on the current locale
 
     | 
  
  
     | 
    
       *	settings.)
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	Spaces and control characters are treated as normal characters.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       * Examples
 
     | 
  
  
     | 
    
       *	The following patterns in the left column will match the filenames in
 
     | 
  
  
     | 
    
       *	the middle column and will not match filenames in the right column:
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	    Pattern	Will Match			Will Not Match
 
     | 
  
  
     | 
    
       *	    -------	----------			--------------
 
     | 
  
  
     | 
    
       *	    a		a (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    a.		a. (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    a?c		abc, acc, arc, a.c		a, ac, abbc
 
     | 
  
  
     | 
    
       *	    a*c		ac, abc, abbc, acc, a.c		a, ab, acb, bac
 
     | 
  
  
     | 
    
       *	    a*		a, ab, abb, a., a.b		b, ba
 
     | 
  
  
     | 
    
       *	    *		a, ab, abb, a., .foo, a.foo	(nothing)
 
     | 
  
  
     | 
    
       *	    *.		a., ab., abb., a.foo.		a, ab, a.foo, .foo
 
     | 
  
  
     | 
    
       *	    *.*		a., a.b, ah.bc.foo		a
 
     | 
  
  
     | 
    
       *	    ^Z		a, ab, abb			a., .foo, a.foo
 
     | 
  
  
     | 
    
       *	    ^Z.		a., ab., abb.			a, .foo, a.foo
 
     | 
  
  
     | 
    
       *	    ^Z.*	a, a., .foo, a.foo		ab, abb
 
     | 
  
  
     | 
    
       *	    *2.c	2.c, 12.c, foo2.c, foo.12.c	2x.c
 
     | 
  
  
     | 
    
       *	    a[b-z]c	abc, acc, azc (only)		(anything else)
 
     | 
  
  
     | 
    
       *	    [ab0-9]x	ax, bx, 0x, 9x			zx
 
     | 
  
  
     | 
    
       *	    a[-.]b	a-b, a.b (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    a[!a-z]b	a0b, a.b, a@b			aab, azb, aa0b
 
     | 
  
  
     | 
    
       *	    a[!-b]x	a0x, a+x, acx			a-x, abx, axxx
 
     | 
  
  
     | 
    
       *	    a[-!b]x	a-x, a!x, abx (only)		(anything else)
 
     | 
  
  
     | 
    
       *	    a[`]]x	a]x (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    a``x	a`x (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    oh`!	oh! (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    is`?it	is?it (only)			(anything else)
 
     | 
  
  
     | 
    
       *	    !a?c	a, ac, ab, abb, acb, a.foo      abc, a.c, azc
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       * History
 
     | 
  
  
     | 
    
       *	1.00 1997-01-03 David Tribble.
 
     | 
  
  
     | 
    
       *		First cut.
 
     | 
  
  
     | 
    
       *	1.01 1997-01-03 David Tribble.
 
     | 
  
  
     | 
    
       *		Added '^Z' pattern character.
 
     | 
  
  
     | 
    
       *		Added fpattern_matchn().
 
     | 
  
  
     | 
    
       *	1.02 1997-01-26 David Tribble.
 
     | 
  
  
     | 
    
       *		Changed range negation character from '^' to '!', ala Unix.
 
     | 
  
  
     | 
    
       *	1.03 1997-08-02 David Tribble.
 
     | 
  
  
     | 
    
       *		Added 'FPAT_XXX' macro constants.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       * Limitations
 
     | 
  
  
     | 
    
       *	This code is copyrighted by the author, but permission is hereby
 
     | 
  
  
     | 
    
       *	granted for its unlimited use provided that the original copyright
 
     | 
  
  
     | 
    
       *	and authorship notices are retained intact.
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       *	Other queries can be sent to:
 
     | 
  
  
     | 
    
       *	    dtribble@technologist.com
 
     | 
  
  
     | 
    
       *	    david.tribble@beasys.com
 
     | 
  
  
     | 
    
       *	    dtribble@flash.net
 
     | 
  
  
     | 
    
       *
 
     | 
  
  
     | 
    
       * Copyright ?1997 by David R. Tribble, all rights reserved.
 
     | 
  
  
     | 
    
       */
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #ifndef ___FNPATTERN_H___
 
     | 
  
  
     | 
    
       #define ___FNPATTERN_H___
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #include "rhcommon.h"
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #define FPAT_QUOTE    '\\'   /* Quotes a special char */
 
     | 
  
  
     | 
    
       #define FPAT_QUOTE2   '`'    /* Quotes a special char */
 
     | 
  
  
     | 
    
       #define FPAT_DEL      '/'    /* Path delimiter */
 
     | 
  
  
     | 
    
       #define FPAT_DEL2     '\\'   /* Path delimiter */
 
     | 
  
  
     | 
    
       #define FPAT_DOT      '.'    /* Dot char */
 
     | 
  
  
     | 
    
       #define FPAT_NOT      '!'    /* Exclusion */
 
     | 
  
  
     | 
    
       #define FPAT_ANY      '?'    /* Any one char */
 
     | 
  
  
     | 
    
       #define FPAT_CLOS     '*'    /* Zero or more chars */
 
     | 
  
  
     | 
    
       #define FPAT_CLOSP    '\x1A' /* Zero or more nondelimiters */
 
     | 
  
  
     | 
    
       #define FPAT_SET_L    '['    /* Set/range open bracket */
 
     | 
  
  
     | 
    
       #define FPAT_SET_R    ']'    /* Set/range close bracket */
 
     | 
  
  
     | 
    
       #define FPAT_SET_NOT  '!'    /* Set exclusion */
 
     | 
  
  
     | 
    
       #define FPAT_SET_THRU '-'    /* Set range of chars */
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       bool fpattern_isvalid(const char *pat);
 
     | 
  
  
     | 
    
       bool fpattern_match(const char *pat, const char *fname);
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       bool _fpattern_submatch(const char *pat, const char *fname);
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #endif // ___FNPATTERN_H___
 
     |