1 // Wild.cpp: implementation of the CWild class.
3 //////////////////////////////////////////////////////////////////////
11 static char THIS_FILE[]=__FILE__;
15 //////////////////////////////////////////////////////////////////////
16 // Construction/Destruction
17 //////////////////////////////////////////////////////////////////////
29 int CWild::fpattern_isvalid(const char *pat)
37 /* Verify that the pattern is valid */
38 for (len = 0; pat[len] != '\0'; len++)
45 if (pat[len] == FPAT_SET_NOT)
46 len++; /* Set negation */
48 while (pat[len] != FPAT_SET_R)
50 if (pat[len] == QUOTE)
51 len++; /* Quoted char */
53 return (FALSE); /* Missing closing bracket */
56 if (pat[len] == FPAT_SET_THRU)
60 if (pat[len] == QUOTE)
61 len++; /* Quoted char */
63 return (FALSE); /* Missing closing bracket */
68 return (FALSE); /* Missing closing bracket */
76 return (FALSE); /* Missing quoted char */
83 return (FALSE); /* Missing subpattern */
96 int CWild::fpattern_submatch(const char *pat, const char *fname)
104 /* Attempt to match subpattern against subfilename */
114 /* Match a single char */
115 if (fch == DEL || fch == DEL2 || fch == '\0')
121 /* Match zero or more chars */
123 while (fname[i] != '\0')// && fname[i] != DEL && fname[i] != DEL2)
128 if (fpattern_submatch(pat, fname+i))
135 /* Match zero or more chars */
137 while (fname[i] != '\0' && fname[i] != DEL && fname[i] != DEL2 && fname[i] != '.')
141 if (fpattern_submatch(pat, fname+i))
148 /* Match a quoted char */
150 if (lowercase(fch) != lowercase(pch) || pch == '\0')
157 /* Match char set/range */
159 if (*pat == FPAT_SET_NOT)
162 yes = FALSE; /* Set negation */
165 /* Look for [s], [-], [abc], [a-c] */
167 while (*pat != FPAT_SET_R && *pat != '\0')
170 pat++; /* Quoted char */
177 if (*pat == FPAT_SET_THRU)
183 pat++; /* Quoted char */
193 /* Compare character to set range */
194 if (lowercase(fch) >= lowercase(lo) &&
195 lowercase(fch) <= lowercase(hi))
203 return (FALSE); /* Missing closing bracket */
210 /* Match only if rest of pattern does not match */
212 return (FALSE); /* Missing subpattern */
213 i = fpattern_submatch(pat, fname);
220 /* Match path delimiter char */
221 if (fch != DEL && fch != DEL2)
227 /* Match a (non-null) char exactly */
228 if (lowercase(fch) != lowercase(pch))
235 /* Check for complete match */
239 /* Successful match */
244 /*-----------------------------------------------------------------------------
246 * Attempts to match pattern 'pat' to filename 'fname'.
249 * 1 (true) if the filename matches, otherwise 0 (false).
252 * If 'fname' is null, zero (false) is returned.
254 * If 'pat' is null, zero (false) is returned.
256 * If 'pat' is empty (""), the only filename it matches is the empty
259 * If 'fname' is empty, the only pattern that will match it is the empty
262 * If 'pat' is not a well-formed pattern, zero (false) is returned.
264 * Upper and lower case letters are treated the same; alphabetic
265 * characters are converted to lower case before matching occurs.
266 * Conversion to lower case is dependent upon the current locale setting.
269 int CWild::fpattern_match(const char *pat, const char *fname)
280 /* Verify that the pattern is valid, and get its length */
281 if (!fpattern_isvalid(pat))
284 /* Attempt to match pattern against filename */
285 if (fname[0] == '\0')
286 return (pat[0] == '\0'); /* Special case */
287 rc = fpattern_submatch(pat, fname);
293 /*-----------------------------------------------------------------------------
295 * Attempts to match pattern 'pat' to filename 'fname'.
296 * This operates like fpattern_match() except that it does not verify that
297 * pattern 'pat' is well-formed, assuming that it has been checked by a
298 * prior call to fpattern_isvalid().
301 * 1 (true) if the filename matches, otherwise 0 (false).
304 * If 'fname' is null, zero (false) is returned.
306 * If 'pat' is null, zero (false) is returned.
308 * If 'pat' is empty (""), the only filename it matches is the empty ("")
311 * If 'pat' is not a well-formed pattern, unpredictable results may occur.
313 * Upper and lower case letters are treated the same; alphabetic
314 * characters are converted to lower case before matching occurs.
315 * Conversion to lower case is dependent upon the current locale setting.
321 int CWild::fpattern_matchn(const char *pat, const char *fname)
332 /* Assume that pattern is well-formed */
334 /* Attempt to match pattern against filename */
335 rc = fpattern_submatch(pat, fname);