|
|
没有处理转义字符
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define TRUE 1
- #define FALSE 0
- int parse_range(char *src,char c)
- {
- char *p;
- p = index(src,'-');
- if(p == NULL)
- {
- if(index(src,c) == NULL)
- return FALSE;
- else
- return TRUE;
- }
- else
- {
- int i,j;
- i = 0;
- j = (int)(p - src);
- if(j == 0)
- {
- if(*(p + 1))
- {
- if(*(p + 2))
- return parse_range(p + 2,c);
- else
- return FALSE;
- }
- else
- return FALSE;
- }
- else if(j == 1)
- {
- if((*(p - 1) >= '0' && *(p - 1) <= '9') && (*(p + 1) >= '0' && *(p + 1) <= '9'))
- {
- if(c >= *(p - 1) && c <= *(p + 1))
- return TRUE;
- else if(*(p + 2))
- return parse_range(p + 2,c);
- else
- return FALSE;
- }
- else if((*(p - 1) >= 'a' && *(p - 1) <= 'z') && (*(p + 1) >= 'a' && *(p + 1) <= 'z'))
- {
- if(c >= *(p - 1) && c <= *(p + 1))
- return TRUE;
- else if(*(p + 2))
- return parse_range(p + 2,c);
- else
- return FALSE;
- }
- else if((*(p - 1) >= 'A' && *(p - 1) <= 'Z') && (*(p + 1) >= 'A' && *(p + 1) <= 'Z'))
- {
- if(c >= *(p - 1) && c <= *(p + 1))
- return TRUE;
- else if(*(p + 2))
- return parse_range(p + 2,c);
- else
- return FALSE;
- }
- else if(*(p + 1))
- {
- if(*(p + 2))
- return parse_range(p + 2,c);
- else
- return FALSE;
- }
- else
- return FALSE;
-
- }
- else // j >= 2
- {
- while(i < j -1)
- {
- if(src[i] == c)
- return TRUE;
- else
- i++;
- }
- return parse_range(p - 1,c);
- }
- }
- }
- int parse_wildcard(char *src,char *dst)
- {
- int head_d = 0,head_s = 0,i,j;
- char *ptr,ascii[128];
- while(1)
- {
- switch(dst[head_d])
- {
- case 'X': if(src[head_s] <= '9' && src[head_s] >= '0')
- {
- head_d++;
- head_s++;
- break;
- }
- else
- return FALSE;
- case 'Z': if(src[head_s] <= '9' && src[head_s] >= '1')
- {
- head_d++;
- head_s++;
- break;
- }
- else
- return FALSE;
-
- case 'N': if(src[head_s] <= '9' && src[head_s] >= '2')
- {
- head_d++;
- head_s++;
- break;
- }
- else
- return FALSE;
- case '[': ptr = index(&dst[head_d],']');
- if(ptr)
- {
- if(!((src[head_s] >= '0' && src[head_s] <= '9') || (src[head_s] >= 'a' && src[head_s] <= 'z') || (src[head_s] >= 'A' && src[head_s] <= 'Z')))
- return FALSE;
- else
- {
- bzero(ascii,128);
- strncpy(ascii,&dst[head_d + 1],(int)(ptr - &dst[head_d]) -1);
- if (parse_range(ascii, src[head_s]) == FALSE)
- return FALSE;
- else
- {
- head_d = (int)((ptr - dst) + 1);
- head_s ++;
- break;
- }
- }
- }
- else
- {
- if(dst[head_d] == src[head_s])
- {
- head_s++;
- head_d++;
- break;
- }
- else
- return FALSE;
- }
- case '.': if(dst[head_d + 1] == '\0' && src[head_s] != '\0')
- return TRUE;
- else
- {
- j = 1;
- while(src[head_s + j])
- {
- if(parse_wildcard(&src[head_s + j],&dst[head_d + 1]) == TRUE)
- return TRUE;
- else
- j++;
- }
- return FALSE;
- }
- case '!': if(dst[head_d + 1] == '\0')
- return TRUE;
- else
- {
- i = 0;
- while(src[head_s + i])
- {
- if(parse_wildcard(&src[head_s + i],&dst[head_d + 1]) == TRUE)
- return TRUE;
- else
- i++;
- }
- return FALSE;
- }
- case '\0': if(src[head_s] == '\0')
- return TRUE;
- else
- return FALSE;
- //case ']': return FALSE;
- default: if(src[head_s] == dst[head_d])
- {
- head_s++;
- head_d++;
- break;
- }
- else
- return FALSE;
- }
- }
- }
- int main(int argc,char **argv)
- {
- if(parse_wildcard(argv[1],argv[2]) == TRUE)
- printf("OK\n");
- else
- {
- if(!strcmp(argv[1],argv[2]))
- printf("OK\n");
- else
- printf("BAD\n");
- }
- return 0;
- }
复制代码 |
|