Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. #include "fnmatch.h"
  2.  
  3. int char_match(const char       **pattern,
  4.            const char       *string)
  5. {
  6.   int   bang = 0;
  7.   int   ret = bang;
  8.   char  c;
  9.  
  10.   if (**pattern != '[')
  11.     return (**pattern == *string);
  12.   if ((*(*pattern + 1) == '!') && ++(*pattern))
  13.     ret = bang = 1;
  14.   while (++(*pattern) && **pattern != ']')
  15.     if (*(*pattern + 1) == '-' && *(*pattern + 2) != ']' && (c = **pattern))
  16.     {
  17.       while (c <= *(*pattern + 2))
  18.     if (c++ == *string)
  19.       ret = !bang;
  20.     }
  21.     else if (**pattern == *string)
  22.       ret = !bang;
  23.   return (ret);
  24. }
  25.  
  26. int     my_fnmatch(const char           *pattern,
  27.                    const char           *string)
  28. {
  29.   const char  *spoint;
  30.   const char  *ppoint;
  31.  
  32.   while ((*string) && (*pattern != '*'))
  33.   {                       /* let's work without stars beforehand */
  34.     if ((*pattern != '?') && (!char_match(&pattern, string)))
  35.       return (1);         /* we found a mismatching char, test is false */
  36.     pattern++;            /* success, we try one byte further */
  37.     string++;
  38.   }
  39.   while (*string)         /* until the end of the string */
  40.     if (*pattern == '*')
  41.     {
  42.       if (!*(++pattern))  /* the pattern ends in a star, the test is true */
  43.         return (0);
  44.       ppoint = pattern;   /* we set a marker right after the star */
  45.       spoint = string+1;
  46.     }
  47.     else  if ((*pattern == '?') || (char_match(&pattern, string)))
  48.     {
  49.       pattern++;      /* we found a matching char, let's try further */
  50.       string++;
  51.     }
  52.     else
  53.     {
  54.       pattern = ppoint;   /* we found a mismatching char, we search again */
  55.       string = spoint++;  /* we look for a matching sequence one byte further*/
  56.     }
  57.   while (*pattern == '*')
  58.     pattern++;            /* if several * at the end  */
  59.   return (*pattern && 1); /* if something remains, test is false */
  60. }
  61.  
  62. int main(int            argc,
  63.          char           **argv)
  64. {
  65.   if (argc < 3)
  66.     return (42);
  67.   return (my_fnmatch(argv[1], argv[2]));
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement