Ticket #235: wildcard.diff
File wildcard.diff, 3.4 KB (added by , 16 years ago) |
---|
-
literal.c
203 203 BOOL wildcard(const PSZ pszBuf, const PSZ pszWildCard, 204 204 const BOOL fNotFileSpec) 205 205 { 206 const CHAR *fstr = pszBuf;206 PSZ fstr = pszBuf; 207 207 PSZ fcard = pszWildCard; 208 INT wmatch = TRUE;209 208 210 while (wmatch && *fcard && *fstr) {211 switch (*fcard){212 case '?': /* character substitution */213 fcard++;214 if (fNotFileSpec || (*fstr != '.' && *fstr != '/' && *fstr != '\\'))215 fstr++; /* skip (match) next character */ 216 break;209 while( *fstr && *fcard ) 210 { 211 switch( *fcard ) 212 { 213 case '*' : 214 { 215 PSZ fstr1; 217 216 218 case '*':219 217 /* find next non-wild character in wildcard */ 220 while (*fcard && (*fcard == '?' || *fcard == '*'))218 while( *fcard && ( *fcard == '*' || *fcard == '?')) 221 219 fcard++; 222 if (!*fcard) /* if last char of wildcard is *, it matches */ 220 221 /* if last char of wildcard is *, it matches */ 222 if( !*fcard ) 223 223 return TRUE; 224 225 fstr1 = fstr; 226 while( *fstr1 ) 227 { 224 228 /* skip until partition, match, or eos */ 225 while (*fstr && toupper(*fstr) != toupper(*fcard) && 226 (fNotFileSpec || (*fstr != '\\' && 227 *fstr != '/' && *fstr != '.'))) 228 fstr++; 229 if (!fNotFileSpec && !*fstr) /* implicit '.' */ 230 if (*fcard == '.') 229 while( *fstr1 && toupper( *fstr1 ) != toupper( *fcard ) && 230 ( fNotFileSpec || ( *fstr1 != '/' && *fstr1 != '\\' ))) 231 fstr1++; 232 233 if( !*fstr1 || ( !fNotFileSpec && ( *fstr1 == '/' || *fstr1 == '\\' ))) 234 break; 235 236 if( wildcard( fstr1, fcard, fNotFileSpec ) == TRUE ) 237 return TRUE; 238 239 fstr1++; 240 } 241 242 fstr = fstr1; 243 break; 244 } 245 246 case '?' : /* character substitution */ 231 247 fcard++; 248 249 if( fNotFileSpec || ( *fstr != '.' && *fstr != '/' && *fstr != '\\')) 250 fstr++; /* skip (match) next character */ 232 251 break; 233 252 234 253 default: 235 if (!fNotFileSpec && ((*fstr == '/' || *fstr == '\\') && 236 (*fcard == '/' || *fcard == '\\'))) 237 wmatch = TRUE; 238 else 239 wmatch = (toupper(*fstr) == toupper(*fcard)); 254 if( fNotFileSpec || 255 ( *fstr != '/' && *fstr != '\\') || 256 ( *fcard != '/' && *fcard != '\\' )) 257 { 258 if( toupper( *fstr ) != toupper( *fcard )) 259 return FALSE; 260 } 261 262 fcard++; 240 263 fstr++; 241 fcard++;242 264 break; 243 265 } 244 266 } 245 267 246 if ((*fcard && *fcard != '*') || *fstr) 247 return 0; 248 else 249 return wmatch; 268 if( !*fstr ) 269 { 270 /* remove trailing * and ? */ 271 while( *fcard && ( *fcard == '?' || *fcard == '*' )) 272 fcard++; 273 274 if( !fNotFileSpec ) 275 { 276 /* remove trailing . */ 277 while( *fcard && *fcard == '.' ) 278 fcard++; 250 279 } 280 } 251 281 282 return ( *fstr == *fcard ); 283 } 284 252 285 // fixup - quote literal character array 253 286 254 287 PSZ fixup(const PCH pachIn, PSZ pszOutBuf, const UINT cBufBytes,