Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define STATE_NORMAL 0
- #define STATE_BRACKETS 1
- #define STATE_ESCAPE 2
- #define LEN 1234
- void parse(char *re, char lower_bound[], char upper_bound[], char asterisks[], char min_count[])
- {
- size_t i, character = 0;
- int state = STATE_NORMAL;
- // char lower_bound[LEN], upper_bound[LEN], asterisks[LEN] = {0}, min_count[LEN] = {0};
- for(i = 0; re[i]; ++i)
- {
- switch(state)
- {
- case STATE_NORMAL:
- {
- switch(re[i])
- {
- case '.':
- if(lower_bound[character - 1] == 0 && upper_bound[character - 1] == 255)
- min_count[character - 1]++;
- else
- {
- lower_bound[character] = 0;
- upper_bound[character] = 255;
- min_count[character]++;
- character++;
- }
- break;
- case '*':
- min_count[character - 1]--;
- asterisks[character - 1] = 1;
- break;
- case '[':
- state = STATE_BRACKETS;
- break;
- case '\\':
- state = STATE_ESCAPE;
- break;
- default:
- if(lower_bound[character-1] == upper_bound[character-1] && lower_bound[character-1] == re[i])
- min_count[character-1]++;
- else
- {
- lower_bound[character] = upper_bound[character] = re[i];
- min_count[character]++;
- character++;
- }
- break;
- }
- }
- case STATE_BRACKETS:
- {
- lower_bound[character] = re[i+1];
- upper_bound[character] = re[i+3];
- min_count[character]++;
- character++;
- i += 4;
- state = STATE_NORMAL;
- }
- case STATE_ESCAPE:
- lower_bound[character] = upper_bound[character] = re[i];
- min_count[character]++;
- character++;
- state = STATE_NORMAL;
- }
- }
- lower_bound[character] = upper_bound[character] = asterisks[character] = min_count[character] = 0;
- }
- int match(char *s, char *lower_bound, char *upper_bound, char *asterisks, size_t *min_count)
- {
- size_t i=0, character = 0;
- while(*upper_bound)
- {
- if((*s < *lower_bound || *s > *upper_bound) && !*asterisks)
- return 0;
- else if(*s < *lower_bound || *s > *upper_bound)
- {
- ++lower_bound;
- ++upper_bound;
- ++asterisks;
- ++min_count;
- }
- else if(*min_count)
- {
- --*min_count;
- ++s;
- }
- else if(*asterisks)
- ++s;
- if(!*asterisks && !*min_count)
- {
- ++lower_bound;
- ++upper_bound;
- ++asterisks;
- ++min_count;
- }
- }
- if(*s)
- return 0;
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement