Advertisement
Guest User

mini re fsm

a guest
Feb 19th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 KB | None | 0 0
  1. #define STATE_NORMAL 0
  2. #define STATE_BRACKETS 1
  3. #define STATE_ESCAPE 2
  4. #define LEN 1234
  5. void parse(char *re, char lower_bound[], char upper_bound[], char asterisks[], char min_count[])
  6. {
  7.     size_t i, character = 0;
  8.     int state = STATE_NORMAL;
  9.     // char lower_bound[LEN], upper_bound[LEN], asterisks[LEN] = {0}, min_count[LEN] = {0};
  10.     for(i = 0; re[i]; ++i)
  11.     {
  12.         switch(state)
  13.         {
  14.         case STATE_NORMAL:
  15.         {
  16.             switch(re[i])
  17.             {
  18.             case '.':
  19.                 if(lower_bound[character - 1] == 0 && upper_bound[character - 1] == 255)
  20.                     min_count[character - 1]++;
  21.                 else
  22.                 {
  23.                     lower_bound[character] = 0;
  24.                     upper_bound[character] = 255;
  25.                     min_count[character]++;
  26.                     character++;
  27.                 }
  28.                 break;
  29.             case '*':
  30.                 min_count[character - 1]--;
  31.                 asterisks[character - 1] = 1;
  32.                 break;
  33.             case '[':
  34.                 state = STATE_BRACKETS;
  35.                 break;
  36.             case '\\':
  37.                 state = STATE_ESCAPE;
  38.                 break;
  39.             default:
  40.                 if(lower_bound[character-1] == upper_bound[character-1] && lower_bound[character-1] == re[i])
  41.                     min_count[character-1]++;
  42.                 else
  43.                 {
  44.                     lower_bound[character] = upper_bound[character] = re[i];
  45.                     min_count[character]++;
  46.                     character++;
  47.                 }
  48.                 break;
  49.             }
  50.         }
  51.         case STATE_BRACKETS:
  52.         {
  53.             lower_bound[character] = re[i+1];
  54.             upper_bound[character] = re[i+3];
  55.             min_count[character]++;
  56.             character++;
  57.             i += 4;
  58.             state = STATE_NORMAL;
  59.         }
  60.         case STATE_ESCAPE:
  61.             lower_bound[character] = upper_bound[character] = re[i];
  62.             min_count[character]++;
  63.             character++;
  64.             state = STATE_NORMAL;
  65.         }
  66.     }
  67.     lower_bound[character] = upper_bound[character] = asterisks[character] = min_count[character] = 0;
  68. }
  69.  
  70. int match(char *s, char *lower_bound, char *upper_bound, char *asterisks, size_t *min_count)
  71. {
  72.     size_t i=0, character = 0;
  73.     while(*upper_bound)
  74.     {
  75.         if((*s < *lower_bound || *s > *upper_bound) && !*asterisks)
  76.             return 0;
  77.         else if(*s < *lower_bound || *s > *upper_bound)
  78.         {
  79.             ++lower_bound;
  80.             ++upper_bound;
  81.             ++asterisks;
  82.             ++min_count;
  83.         }
  84.         else if(*min_count)
  85.         {
  86.             --*min_count;
  87.             ++s;
  88.         }
  89.         else if(*asterisks)
  90.             ++s;
  91.         if(!*asterisks && !*min_count)
  92.         {
  93.             ++lower_bound;
  94.             ++upper_bound;
  95.             ++asterisks;
  96.             ++min_count;
  97.         }
  98.     }
  99.     if(*s)
  100.         return 0;
  101.     return 1;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement