加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

getopt32

发布时间:2020-12-16 22:27:21 所属栏目:大数据 来源:网络整理
导读:uint32_t getopt32(char **argv,const char *applet_opts,…) 命令行选项必须声明为类似const char *applet_opts的字符串形式,例如: flags = getopt32(argv,"rnug"); 如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。 标志值

uint32_t getopt32(char **argv,const char *applet_opts,…)
命令行选项必须声明为类似const char *applet_opts的字符串形式,例如:
flags = getopt32(argv,"rnug");

如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。

标志值由字符在applet_opts种的位置决定,例如在上例中:
flags = getopt32(argv,"rnug");

"r"将添加1 (0比特位)
"n"将添加2 (1比特位)
"u"将添加4 (2比特位)
"g"讲添加8 (3比特位)

等等,你也可以通过位域方式查看返回值,每个选项就是其中一位.

一旦退出,全局变量optind就被设置,因此如果你做argc -= optind; argv+= optind; argc就会等于剩下的非选项的参数个数,第一个放在argv[0],下一个放在argv[1]等等(选项和它们的参数在argv[optind]之前都会被移到argv[]中).

":"如果一个选项需要一个参数,那就在applet_opts字符后面添加":"然后提供指向参数的指针. 例如:
char *pointer_to_arg_for_a;
char *pointer_to_arg_for_b;
char *pointer_to_arg_for_c;
char *pointer_to_arg_for_d;

flags = getopt32(argv,"a:b:c:d:",
&pointer_to_arg_for_a,&pointer_to_arg_for_b,
&pointer_to_arg_for_c,&pointer_to_arg_for_d);
指针类型(char* 或 llist_t *)可以由"::"特殊分隔符控制,该分隔符由外部字符串opt_complementary设置(详细信息请看下面)

"::" 如果选项有一个可选参数,那就在applet_opts字符后面添加一个"::"并提供一个存储参数的指针. 注意可选参数必需紧跟着选项: -oparam而不是-o param.

"+" 如果applet_opts字符串第一个字符是加号,那就argv数组中一旦遇上非选项字符就马上停止选项处理. 对于像env那样的applet就不会处理参数为子程序了: env -i ls -d /
这里我们希望env仅仅处理'-i'不是'-d'.

const char *applet_long_options
该结构体允许你定义长选项:
static const char applet_longopts[] ALIGN1 =
//"name" has_arg val
"verbose" No_argument "v";
applet_long_options = applet_longopts;

结构体的最后一个成员(val)通常在applet_opts里面设置用来匹配短选项. 如果在applet_opts里面没有匹配到,如是:
– 短选项的下一个位置的比特数
– 如果has_arg不是"No_argument",也可以使用ptr作为参数
– opt_complementary也可以影响到它.

注意: 一个好的applet可以让长参数可配置,通过配置处理而不是必需的特征. 当前标准命名配置选项为CONFIG_FEATURE_<applet>_LONG_OPTIONS.

const char *opt_complementary
":" 冒号用来分隔两个或多个字符并/或字符组以及特殊字符(表示要检查一些状态)

"abc" 如果指定了两个或多个字符组, 第一个字符就是主选项,其余的字符是副选项。 如果找到了主选项,他们的标志就出现了即使没有在命令行中指定他们. 例如:

opt_complementary = "abc";
flags = getopt32(argv,"abcd");

如果getopt()找到命令行中的"-a",getopt32的返回值就好比找到了"-a -b -c".

"ww" 调整有计数器关联来指示选项的发生次数的双选项. 例如ps applet的需要:
如果w给定一次,GNU ps设置宽度为132,
如果w给定的多于一次,就是"无限制"

int w_counter = 0; //必需初始化
opt_complementary = "ww";
getopt32(argv,"w",&w_counter);
if (w_counter)
width = (w_counter == 1) ? 132 : INT_MAX;
else
get_terminal_width(…&width…);

w_counter是一个指向整数的指针,它得在所有选项参数沉下去之后传给getopt32().

例如: 接受多个-v来表示冗长级别和每一个-b optarg级别,添加optarg到my_b. 最后,如果给定了b就关闭c或者反过来:
llist_t *my_b = NULL;
int verbose_level = 0;
opt_complementary = "vv:b::b-c:c-b";
f = getopt32(argv,"vb:c",&my_b,&verbose_level);
if (f & 2) //-c在-b后面,取消设置-b标志
while (my_b) dosomething_with(llist_pop(&my_b));
if (my_b) //但是如果指定了-b就存储llist
free_llist(my_b);
if (verbose_level) printf("verbose level is %dn",verbose_level);

特殊字符:
"-" opt_complementary组中的起始字符是横线强制要求所有参数作为选项来看待,尽管它们没有横线打头. 这种情况下下一个字符不能是数字(0-9),使用':'或行结束符. 例如:
opt_complementary = "-:w-x:x-w";
getopt32(argv,"wx");
允许不适用横线而给定所有参数(./program w x),就像带有横线一样(./program -x).
NB: getopt32()会泄露一小部分内存如果你使用这个项. 如果有递归调用getopt32()的可能就不要使用.

"–" opt_complementary开始的双横线表示argv[1]字符串应该总是作为选项来看待,尽管不是以"-"做前缀. 这在诸如"ar"和"tar"的applet中有特别语义:
tar xvf foo.tar
NB: 如果你使用这个项,getopt32()将会泄露一小部分内存. 如果有递归调用getopt32()的可能就不要使用.

"-N" opt_complementary组的起始横线紧跟一个数字(0-9)意味着至少要在命令行里面出现N个非选项的参数.

"=N" opt_complementary起始的等号符紧跟打个数字(0-9)意味着要在命令行里出现恰好N个非选项参数.

Face:<( ̄︶ ̄)> | (⊙?⊙) | >﹏< | b( ̄▽ ̄)d | (─.─||) | (^_-)

Copyright ? 2008 - Powered by - InText Theme Origin Design by Instah Edited by ray

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读