(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的编码方式,简洁、美观,正在逐步向这方面培养