Ticket #235: wildcard.diff

File wildcard.diff, 3.4 KB (added by komh, 16 years ago)

Multidot filename assocition patch

  • literal.c

     
    203203BOOL wildcard(const PSZ pszBuf, const PSZ pszWildCard,
    204204              const BOOL fNotFileSpec)
    205205{
    206   const CHAR *fstr = pszBuf;
     206    PSZ fstr = pszBuf;
    207207  PSZ fcard = pszWildCard;
    208   INT wmatch = TRUE;
    209208
    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;
    217216
    218     case '*':
    219217      /* find next non-wild character in wildcard */
    220       while (*fcard && (*fcard == '?' || *fcard == '*'))
     218                while( *fcard && ( *fcard == '*' || *fcard == '?'))
    221219        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 )
    223223        return TRUE;
     224
     225                fstr1 = fstr;
     226                while( *fstr1 )
     227                {
    224228      /* 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 */
    231247          fcard++;
     248
     249                if( fNotFileSpec || ( *fstr != '.' && *fstr != '/' && *fstr != '\\'))
     250                    fstr++;     /* skip (match) next character */
    232251      break;
    233252
    234253    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++;
    240263      fstr++;
    241       fcard++;
    242264      break;
    243265    }
    244266  }
    245267
    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++;
    250279}
     280    }
    251281
     282    return ( *fstr == *fcard );
     283}
     284
    252285// fixup - quote literal character array
    253286
    254287PSZ fixup(const PCH pachIn, PSZ pszOutBuf, const UINT cBufBytes,