wget [options] [URL-list]
wget (-; +; :" ) 选项
可以以这些选项开头,这些是决定排序顺序的,排序顺序见前面几个的分析。
这里说一下,这个argv和argc的应用。
argc: 整数,为传给main()的命令行参数个数。
argv: 字符串数组。 argv是char
**类型,所以它可以指向任何一个选项的字符或者字符串。而且是依次指向。这就为后面的分析打下了很好的基础。
这只是说到选项,还没有涉及到URL-list。
总结一下前面的周折,给出一个比较宏观的过程:
首先初始化时间,因为时间很重要:),以后会用到的计时器初始化:
- struct ptimer *timer = ptimer_new (); /*通过读取映射到系统空间的硬件时钟值来初始化,时钟方面看博客有linux 计时器*/
复制代码- 895 double start_time = ptimer_measure (timer); /*来矫正真正启动的时间如果出现逝去时间(单调时间小于前面的时间值,就重新设置,返回当前的单调时间值(elapsed)作为开始时间,因为准确*/
复制代码- /*检查本地的字符集, i18n_initialize ();
- 如果并初始化有些需要调用的二进制文件路径(113 setlocale (LC_ALL, "");
- 115 bindtextdomain ("wget", LOCALEDIR);
- 116 textdomain ("wget");
- */
复制代码- 设置程序名称:
- 在VMS上要去掉 dev:[dir]前缀和.EXE后缀
- exec_name = vms_basename (argv[0]);
- argv[0]是本质*/
复制代码- 默认初始化选项的一些属性,如果你在选项中没有设置属性的话,当然不能没有
- 917 defaults ();
复制代码- 这
个文件是将cmdline_options类型的option_data[]数组中的所有元素进行分类存放。存放在long_options数组
(option类型,存储long_option的名称,有无参数,它对应的标志(OPT_VALUE等),还有个val记录本身是否在1024内,如果
在外边那么说明,这是带有no-前缀的,(char
类型只存储段选项和参数)short_options数组,还有optmap[]数组将短长选项对应起来。
- 919 init_switches ();
复制代码- 后面花费时间最长的就是这个get_long()函数了
- 这个函数是选择长选项和短选项进行匹配,
- 出现的情况就是找到了,那么在后面看看是否注册if (strcmp (config_opt->long_name, "config") == 0)
- 我查了下,只有一个文件的long_name为config,只会检测这个是否注册成功,这涉及到后面的wgetrc文件的注册。 { "config", 0, OPT_VALUE, "chooseconfig", -1 }
- 很多程序在后面都会返回一个"?"的ascii码值。ascii码是127应该是个随意值(i think they make it for fun),所以会进行检查。
- 其他的都不用管,因为 bool userrc_ret = true;
复制代码- 查找的过程中,如果找到了相似,我指的是long_name相同,但是参数不同,属性不同啦,都会将错误输出stderr来显示错误
- if (pfound->has_arg)
- 610 d->optarg = nameend + 1;
- 如果找到了长选项,然后它还有一个参数,那么就用d->optarg来存储选项后面的参数。在后面将用它作为用户写入.wgetrc文件的内容。
复制代码- 935 if (strcmp (config_opt->long_name, "config") == 0)
- 936 {
- 937 userrc_ret &= run_wgetrc (optarg);
- 938 use_userconfig = true;
- 939 }
- */
复制代码- 530 run_wgetrc (const char *file) 调用
复制代码- 545 while ((line = read_whole_line (fp)) != NULL) /*读取刚写入optarg文件的每一行进行测试*/
- 546 {
- 547 char *com = NULL, *val = NULL;
- 548 int comind;
- 549
- 550 /* Parse the line. */
- 551 switch (parse_line (line, &com, &val, &comind)) /*对命令所在选项位置进行匹配,匹配成功就是line_ok,出现错误就打印出来。*
复制代码
- 950 if (use_userconfig == false)
- 951 initialize ();
- /*这里是如果没有注册进去,在这里才会将use_userconfig = ture;
- 读取环境变量,然后找到此文件,进行写!
复制代码
阅读(906) | 评论(0) | 转发(0) |