LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 812|回复: 2

命令行通配

[复制链接]
发表于 2006-8-10 09:46:23 | 显示全部楼层 |阅读模式
没有处理转义字符
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>


  4. #define TRUE 1
  5. #define FALSE 0


  6. int parse_range(char *src,char c)
  7. {
  8.         char *p;
  9.         p = index(src,'-');
  10.         if(p == NULL)
  11.         {
  12.                 if(index(src,c) == NULL)
  13.                         return FALSE;
  14.                 else
  15.                         return TRUE;
  16.         }
  17.         else
  18.         {
  19.                 int i,j;
  20.                 i = 0;
  21.                 j = (int)(p - src);
  22.                 if(j == 0)
  23.                 {
  24.                         if(*(p + 1))
  25.                         {
  26.                                 if(*(p + 2))
  27.                                         return parse_range(p + 2,c);
  28.                                 else
  29.                                         return FALSE;
  30.                         }
  31.                         else
  32.                                 return FALSE;
  33.                 }
  34.                 else if(j == 1)
  35.                 {
  36.                         if((*(p - 1) >= '0' && *(p - 1) <= '9') && (*(p + 1) >= '0' && *(p + 1) <= '9'))
  37.                         {
  38.                                 if(c >= *(p - 1) && c <= *(p + 1))
  39.                                         return TRUE;
  40.                                 else if(*(p + 2))
  41.                                         return parse_range(p + 2,c);
  42.                                 else
  43.                                         return FALSE;
  44.                         }
  45.                         else if((*(p - 1) >= 'a' && *(p - 1) <= 'z') && (*(p + 1) >= 'a' && *(p + 1) <= 'z'))
  46.                         {
  47.                                 if(c >= *(p - 1) && c <= *(p + 1))
  48.                                         return TRUE;
  49.                                 else if(*(p + 2))
  50.                                          return parse_range(p + 2,c);
  51.                                 else
  52.                                         return FALSE;
  53.                         }
  54.                         else if((*(p - 1) >= 'A' && *(p - 1) <= 'Z') && (*(p + 1) >= 'A' && *(p + 1) <= 'Z'))
  55.                         {
  56.                                 if(c >= *(p - 1) && c <= *(p + 1))
  57.                                         return TRUE;
  58.                                 else if(*(p + 2))
  59.                                          return parse_range(p + 2,c);
  60.                                 else
  61.                                         return FALSE;
  62.                         }
  63.                         else if(*(p + 1))
  64.                         {
  65.                                 if(*(p + 2))
  66.                                         return parse_range(p + 2,c);
  67.                                 else
  68.                                         return FALSE;
  69.                         }
  70.                         else
  71.                                 return FALSE;
  72.                        
  73.                 }
  74.                 else   // j >= 2
  75.                 {
  76.                         while(i < j -1)
  77.                         {
  78.                                 if(src[i] == c)
  79.                                         return TRUE;
  80.                                 else
  81.                                         i++;
  82.                         }

  83.                         return parse_range(p - 1,c);       
  84.                 }
  85.         }
  86. }

  87. int parse_wildcard(char *src,char *dst)
  88. {
  89.         int head_d = 0,head_s = 0,i,j;
  90.         char *ptr,ascii[128];

  91.         while(1)
  92.         {
  93.                 switch(dst[head_d])
  94.                 {
  95.                         case 'X':        if(src[head_s] <= '9' && src[head_s] >= '0')
  96.                                         {
  97.                                                 head_d++;
  98.                                                 head_s++;
  99.                                                 break;
  100.                                         }
  101.                                         else
  102.                                                 return FALSE;

  103.                         case 'Z':        if(src[head_s] <= '9' && src[head_s] >= '1')
  104.                                         {
  105.                                                 head_d++;
  106.                                                 head_s++;
  107.                                                 break;
  108.                                         }
  109.                                         else
  110.                                                 return FALSE;
  111.        
  112.                         case 'N':       if(src[head_s] <= '9' && src[head_s] >= '2')
  113.                                         {
  114.                                                 head_d++;
  115.                                                 head_s++;
  116.                                                 break;
  117.                                         }
  118.                                         else
  119.                                                 return FALSE;

  120.                         case '[':        ptr = index(&dst[head_d],']');
  121.                                         if(ptr)
  122.                                         {
  123.                                                 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')))
  124.                                                                return FALSE;
  125.                                                 else
  126.                                                 {
  127.                                                         bzero(ascii,128);
  128.                                                         strncpy(ascii,&dst[head_d + 1],(int)(ptr - &dst[head_d]) -1);
  129.                                                         if (parse_range(ascii, src[head_s]) == FALSE)
  130.                                                                 return FALSE;
  131.                                                         else
  132.                                                         {
  133.                                                                 head_d = (int)((ptr - dst) + 1);
  134.                                                                 head_s ++;
  135.                                                                 break;
  136.                                                         }
  137.                                                 }
  138.                                         }
  139.                                         else
  140.                                         {
  141.                                                 if(dst[head_d] == src[head_s])
  142.                                                 {
  143.                                                         head_s++;
  144.                                                         head_d++;
  145.                                                         break;
  146.                                                 }
  147.                                                 else
  148.                                                         return FALSE;
  149.                                         }


  150.                         case '.':        if(dst[head_d + 1] == '\0' && src[head_s] != '\0')
  151.                                                 return TRUE;
  152.                                         else
  153.                                         {
  154.                                                 j = 1;
  155.                                                 while(src[head_s + j])
  156.                                                 {
  157.                                                         if(parse_wildcard(&src[head_s + j],&dst[head_d + 1]) == TRUE)
  158.                                                                 return TRUE;
  159.                                                         else
  160.                                                                 j++;
  161.                                                 }
  162.                                                 return FALSE;
  163.                                         }

  164.                         case '!':        if(dst[head_d + 1] == '\0')
  165.                                                 return TRUE;
  166.                                         else
  167.                                         {
  168.                                                 i = 0;
  169.                                                 while(src[head_s + i])
  170.                                                 {
  171.                                                         if(parse_wildcard(&src[head_s + i],&dst[head_d + 1]) == TRUE)
  172.                                                                 return TRUE;
  173.                                                         else
  174.                                                                 i++;
  175.                                                 }
  176.                                                 return FALSE;
  177.                                         }               

  178.                         case '\0':        if(src[head_s] ==  '\0')
  179.                                                 return TRUE;
  180.                                         else
  181.                                                 return FALSE;

  182.                         //case ']':        return FALSE;

  183.                         default:        if(src[head_s] == dst[head_d])
  184.                                         {
  185.                                                 head_s++;
  186.                                                 head_d++;
  187.                                                 break;
  188.                                         }
  189.                                         else
  190.                                                 return FALSE;
  191.                 }
  192.         }
  193. }



  194. int main(int argc,char **argv)
  195. {
  196.         if(parse_wildcard(argv[1],argv[2]) == TRUE)
  197.                 printf("OK\n");
  198.         else
  199.         {
  200.                 if(!strcmp(argv[1],argv[2]))
  201.                         printf("OK\n");
  202.                 else
  203.                         printf("BAD\n");
  204.         }

  205.         return 0;
  206. }

复制代码
发表于 2006-8-10 10:58:52 | 显示全部楼层
这个是什么意思阿?
有什么问题呢
还是show你的程序阿?
回复 支持 反对

使用道具 举报

发表于 2006-8-10 17:15:24 | 显示全部楼层
什么叫命令行通配
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表