coreutils4.5.1 basename.c代码分析

coreutils4.5.1 basename.c代码分析
今天早上醒来很早,在床上就想,自己用电脑分析源码的模式是什么?
我想,应该是用两个显示器,一个显示器上就专门打开vim,用于查看代码,另一个显示器上就在命令行下进行编译,进行测试。这样两个屏幕进行切换,最大化的提高效率。
另外,我打开文件后,总是喜欢加入打印语句,为此,再加一个缩写:
abbr pd printf("hello\n");  
提高一点效率。
另个,我读代码时,总是按代码行数来读的,能否写一个脚本,一次用vim打开多个C文件,然后在vim中进行切换,但没写成功。
ls *.c |wc -l |sort -n | awk '{print $2}' | xargs vim
退出vim时,就乱了,不知是何原因?下回再折腾。
又从行数少的代码开始读。代码每回读都有新的见解。今天把basename.c重读了。
在main()函数中加入打印语句,如下:
  printf("hello(%s)\n",argv[1]); 
  name = base_name (argv[1]);
  printf("hello(%s)\n",name); 
  name[base_len (name)] = '\0';

  printf("hello(%d)\n",base_len("is..ok///")); 
  if (argc == 3)
    remove_suffix (name, argv[2]);

  puts (name);
今天想重点分析下其中base_len的用法。进入到其源码:
size_t
base_len (char const *name)
{
  size_t len;

  for (len = strlen (name);  1 < len && ISSLASH (name[len - 1]);  len--)
    continue;

  return len;
}
我能理解到当遇到/时,要特殊处理,但如何处理?真不懂。
这段代码硬是看不懂,于是进行调试。
./basename /a/b/this.ok
再单独加
  printf("hello(%d)\n",base_len("is..ok///")); 
 结果为
 6,
 也就是说,末尾的'/'去掉了。原来是这个意思。
我脑袋转不快,发现一定要弄明白作者想达到的效果,再反过来读代码就容易理解了。不然,真是头脑。
为此,我理解了,“给我看你的流程图,我将不理解,但给我看你的表,就理解了”,因为流程图是动态的,没有定形。而数据结构是固定的,能固定,就易于理解了。所以数据结构是个好东西。
另外,程序dirname.c中的一个函数
size_t
dir_len (char const *path)
{
  size_t prefix_length = FILESYSTEM_PREFIX_LEN (path);
  size_t length;

  /* Strip the basename and any redundant slashes before it.  */
  for (length = base_name (path) - path;  prefix_length < length;  length--)
    if (! ISSLASH (path[length - 1]))
      return length;

  /* But don't strip the only slash from "/".  */
  return prefix_length + ISSLASH (path[prefix_length]);
}
也容易理解了,如"/a/b/mm.ok"
逻辑是从字串末尾开始查找/,找到后返回其序号,如此而已。
发现读代码一定要加打印语句,要编译,要打测试例子。当看是不解决问题的,或许要把读代码改为调试代码,才有效果。
想想以前,想用ipad,kindle看代码,确实有些吃惊了。也许已经理解透切的代码,再用kindle看,可以加深理解,但如果没理解的代码,不调试着看的话,真是太难懂了,效率也太低了。
我现在迷上了站立式办公,迷上了双屏操作。感觉如果能提高理解代码的速度,花点钱也是有价值的。可惜,深入进源码后,没有捷径可找。双屏操作也只是把能简化的进行了简化,遇到复杂的逻辑,就只能硬着头皮上了。
不过,看代码是越来越快的。我今天还把mkfifo这个命令学了一遍。
读代码是深入到最细节,但如果会使用就能更快的理解。而且我看代码,是从大块开始看,先立足于了解每个函数,每段代码要完成的事,再细看它具体是如何完成的。由粗到细。再由细到粗。哈哈。

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/85779714