Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305042
  • 博文数量: 94
  • 博客积分: 2163
  • 博客等级: 大尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 09:23
文章存档

2012年(2)

2011年(92)

分类: LINUX

2011-10-06 15:50:24


  1. init_switch(opt->type)
  2. {
  3. . . . . . .
  4.   case OPT_VALUE:   /*一般是指短选项含有参数,此类型是含有参数为 1.
  5.   longopt->has_arg = required_argumet;
  6.   if (opt->short_name)  /*如果短选项不为空*/
  7.     *p++ = ';';   /*将":"添入char 类型short_options数组中*/
  8.     break;           /*其他返回*/
  9. case  OPT_BOOLEN:  /*这里是指的是长选项*/
  10.    longopt->has_arg = optional_argument;   /* # define optional_argument      2
  11. 此值定义为2,表示理想参数为 2*/
  12.    longopt = &long_options[o++];  /*操作 long_options数组*/
  13.    longopt->name = no_prefix (opt->long_name);  /1、___---->main.c添入long_options数组的元素的域,no_prefix()表示加上"no-"表示没有*/
  14.    longopt->has_arg = no_argument;    /*没有参数 为 0*/
  15.   longopt->val = i | BOOLEAN_NEG_MARKER;  /*longopt->val的值为 一个大于1024的数作为是否出错判断*/
  16.           break;  
  17.        default:
  18.            assert (opt->argtype != -1);  /*如果argtype不是 -1*/
  19.            longopt->has_arg = opt->argtype;   /*has_arg指向opt->argtype指向的地方*/
  20.           if (opt->short_name)  /*如果短选项不为 0*;
  21.             {
  22.                if (longopt->has_arg == required_argument)
  23.                  *p++ = ':';   /*如果参数为其他值,不要处理 optional_argument 的情况*/
  24. 384               /* Don't handle optional_argument */
  25. 385             }
  26. 386         }
  27. 387     }
  28. 388   /* Terminate short_options. */
  29. 389   *p = '\0';  /*在short_options数组中存放了一个" : "*/
  30. 390   /* No need for xzero(long_options[o]) because its storage is static
  31. 391      and it will be zeroed by default.  */
  32. 392   assert (o <= countof (long_options));  /*循环的大小当然是小于总个数了*/
  33. 393 }
复制代码
1、_________________------------------>
302 no_prefix (const char *s)
303 {
304   static char buffer[1024];   
305   static char *p = buffer;
306
307   char *cp = p;   
308   int size = 3 + strlen (s) + 1;  /*看样子no- 和string不是在一起的。在options_tables[]中既可以看出 "no-STRING\0" 加上前面的"no-"  和 后面的 \0字符*/
309   if (p + size >= buffer + sizeof (buffer))    /*如果字符串地址大于了buffer数组的地址那么就abort()*/
310     abort ();
311
312   cp[0] = 'n', cp[1] = 'o', cp[2] = '-';  /*给前面这几个字符赋值*/
313   strcpy (cp + 3, s);  /*然后copy*/
314   p += size;  /*用p记录当前使用的最后位置即为\0后面第一个字符位置*/
315   return cp;  /*返回字符初始地址*/
316 }
阅读(2444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~