Advertisement
Guest User

Wildcard pattern match

a guest
Jan 10th, 2012
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. bool pattern_match( const char *str, const char *pattern )
  2. {
  3.     while( *pattern )
  4.     {
  5.         bool any = false;
  6.         if( *pattern == '*' )
  7.         {
  8.             any =  true;
  9.  
  10.             while( *pattern == '*' )
  11.             {
  12.                 ++pattern;
  13.  
  14.                 if( *pattern == '?' )
  15.                 {
  16.                     char const * p = pattern;
  17.                     char const * s = str;
  18.                     while( *p == '?' )
  19.                     {
  20.                         if( ! *s )
  21.                             return false;
  22.                         ++p;
  23.                         ++s;
  24.                     }
  25.                     if( *p == '*' )
  26.                     {
  27.                         str = s;
  28.                         pattern = p;
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.  
  34.         if( ! *pattern )
  35.             return ! *str || any;
  36.  
  37.         if( ! *str )
  38.             return false;
  39.  
  40.         while( *str )
  41.         {
  42.             bool good = true;
  43.    
  44.             const char * st = str;
  45.             const char * p = pattern;
  46.             while( *st && *p && *p != '*' )
  47.             {
  48.                 if( ! ( *p == '?' || *p == *st ) )
  49.                 {
  50.                     good = false;
  51.                     break;
  52.                 }
  53.                 ++p;
  54.                 ++st;
  55.             }
  56.  
  57.             if( good && ! *p)
  58.                 good = ! *st;
  59.  
  60.             if( good )
  61.             {
  62.                 str = st;
  63.                 pattern = p;
  64.                 break;
  65.             }
  66.             else
  67.             {
  68.                 if( any )
  69.                     ++str;
  70.                 else
  71.                     return false;
  72.             }
  73.         }
  74.     }
  75.     return ! *str;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement