现在的位置: 首页 > 综合 > 正文

【wget参数转化】 option_data 转化

2012年06月27日 ⁄ 综合 ⁄ 共 2519字 ⁄ 字号 评论关闭

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:所在目录,居住

抱歉!评论已关闭.