main 函数首先获得程序的名字,大概是wget的名称
系统宏:
#ifdef TARGET_OS_MAC #endif #ifdef __linux__//标识是linux系统 #endif #ifdef _WIN32 || _WIN64//不同操作系统使用不同的宏 #endif
Option_data |
Long_option |
long_name(char*) |
name |
short_name(char) |
Optmap为short_name做索引 |
Type(enum) |
Has_arg base on type 不是bool和OPT_VALUE的直接使用argtype参数作为has_arg结果 |
Data(void*) |
Val->option_data index |
Argtype(int) |
Has_arg base on type 不是bool和OPT_VALUE的直接使用argtype参数作为has_arg结果 |
optmap 映射shortname 到long_option的索引
所使用的方法是optmap[opt->short_name- 32] = longopt - long_options;
从main函数开始:
首先获得程序的名字如果是wget在window上运行的话,还得去掉.exe后缀名,linux就不用了,linux上只要有可执行权限就好了
i18n_initialize ();//配置国际化的东西,和系统环境有关系,这里就是为了支持所有语言环//境 exec_name = strrchr (argv[0], PATH_SEPARATOR); if (!exec_name) exec_name = argv[0]; else ++exec_name; #ifdef WINDOWS /* Drop extension (typically .EXE) from executable filename. */ windows_main ((char **) &exec_name); #endif
设置opt选项的默认值和调用配置文件
initialize (void) { char *file; intok = true; defaults ();//这里设置wget中opt的默认值,为了是初始化。 #ifdef SYSTEM_WGETRC if(file_exists_p (SYSTEM_WGETRC)) ok &= run_wgetrc (SYSTEM_WGETRC); #endif /*Override it with your own, if one exists. */ file = wgetrc_file_name (); //'TODO::linux上是不存在这个文件的。 if(!file)//llinux 上不存在wgetrc的配置文件直接返回 return;
下面的函数吧option_data转化成long_option 和optmap
TODO::这里是根据option_data 来转换short_option和long_option的
static void init_switches (void) { char *p = short_options; inti, o = 0; for(i = 0; i < countof (option_data); i++) { struct cmdline_option *opt = &option_data[i]; struct option *longopt; if (!opt->long_name) /* The option is disabled. */ continue; longopt = &long_options[o++]; longopt->name = opt->long_name; /* long_option option_data name -> long_name; val -> option_data 所在索引。 has_arg -> re_argument,optional_argment, noset the member of flag*****?????****** add by LeoK 2011-11-28 */ longopt->val = i; if (opt->short_name) { *p++ = opt->short_name; optmap[opt->short_name - 32] = longopt - long_options; } switch (opt->type) { case OPT_VALUE: longopt->has_arg = required_argument; if (opt->short_name) *p++ = ':'; break; case OPT_BOOLEAN: /* Specify an optional argument for long options, so that --option=off works the same as --no-option, for compatibility with pre-1.10 Wget. However, don't specify optional arguments short-option booleans because they prevent combining of short options. */ longopt->has_arg = optional_argument; longopt = &long_options[o++]; longopt->name = no_prefix (opt->long_name); longopt->has_arg = no_argument; longopt->val = i | BOOLEAN_NEG_MARKER; break; default: assert (opt->argtype != -1); longopt->has_arg = opt->argtype; if (opt->short_name) { if (longopt->has_arg ==required_argument) *p++ = ':'; } } } *p= '\0'; assert (o <= countof (long_options)); }
note:
单词: catalog:目录,编目录 bail out: 保释 parse:解析,分析 verbose:冗长 fatal:致命的,致死的 recursive:递归的,回归的 span:跨越,穿越 porting:移植 reside:所在目录,居住