Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42425
  • 博文数量: 13
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-11 20:07
文章分类

全部博文(13)

文章存档

2010年(13)

我的朋友

分类: LINUX

2010-01-14 20:35:42

    经历了三天的“煎熬“,终于弄完了utils,下周有个面试,这几天准备一下,暂停一下wget。将utils.c剩下的简单的分析一下。

(1)number_to_string使用了DIGITS_宏来进行数字到字符串的转换,此处也可以使用递归的方式将数字转换成字符串。采用下列函数:
void number_to_string (int n)
{
if (n < 10)
{
PR (n);
return;
}
number_to_string (n / 10);
PR (n % 10);
}
(2)alarm_set、run_with_timeout等超时操作函数调用信号操作函数来控制线程的运行、休眠等操作,值得注意的是sigsetjmp和siglongjmp两个函数,由于它们会使程序不易令人理解,所以不要轻易使用。
(3)base64格式转换:base64_encode、base64_decode
ASCII字符转换为base64格式,关于base64格式的转换可以参看这篇文章:http://blog.csdn.net/LR_SmileWorld/archive/2009/12/23/5057914.aspx
作者写的转换非常的简练而且用了大量的位移操作,看了半天很头大,且“拿来主义”,不细究它的实现原理了,base64的pad的格式需要注意一下,尤其是当将base64格式的转换为ASCII字符时。Pad的设置在链接的文章中有详细的介绍。
(4)另外还有一点关于C0和C1控制字符的知识,想要深入了解的人可以参看以下文章:(英文滴)
(5)Wget的效率技巧 以utils.c的concat_string为例。
作者可能是受到Apache源码里apr_pstrcat的启发,函数首先计算传入字符串列表中字符串的总长度,并使用大小为5的saved_lenghts数组保存字符串列表中的前五个字符串的长度,如此以来在将字符串复制到内存分配空间时就不需要使用strlen函数重新计算字符串的长度,以此提高了函数的执行效率。
char *
concat_strings (const char *str0, ...)
{
  va_list args;
  int saved_lengths[5];         /* inspired by Apache's apr_pstrcat */
  char *ret, *p;

  const char *next_str;
  int total_length = 0;
  size_t argcount;

  /* Calculate the length of and allocate the resulting string.计算字符串列表的字符串的总长度 */

  argcount = 0;/* 参数个数 */
  va_start (args, str0);/* 使用第一个参数地址初始化参数列表 */
  for (next_str = str0; next_str != NULL; next_str = va_arg (args, char *))
    {
      int len = strlen (next_str);
      if (argcount < countof (saved_lengths))/* 如果数量小于argcount则保存到数组中,不需要重复调用strlen函数 提高系统效率 */
        saved_lengths[argcount++] = len;
      total_length += len;
    }
  va_end (args);
  p = ret = xmalloc (total_length + 1);

  /* Copy the strings into the allocated space. 将字符串复制到分配的区域*/

  argcount = 0;
  va_start (args, str0);
  for (next_str = str0; next_str != NULL; next_str = va_arg (args, char *))
    {
      int len;
      if (argcount < countof (saved_lengths))
        len = saved_lengths[argcount++];
      else
        len = strlen (next_str);
      memcpy (p, next_str, len);
      p += len;/* 将p指向下一位置 */
    }
  va_end (args);
  *p = '\0';

  return ret;
}
ps:非常喜欢wget的编码方式,简洁、美观,正在逐步向这方面培养
阅读(1586) | 评论(1) | 转发(1) |
0

上一篇:惊讶!

下一篇:C的Stack实现

给主人留下些什么吧!~~

chinaunix网友2010-04-14 11:22:23

兄弟,我也想分析一下WGET,你的QQ呢,我们联系一下 ,我的QQ:373315171