gnu coreutils-4.5.1 echo.c代码分析2

gnu coreutils-4.5.1 echo.c代码分析2
这个代码今天又读一遍,感觉有些眉目了。比第一回看时,更有些眉目了。第一回看时,恨不得一下看完,马上理解。现在重读,感觉上就从容多了。反正后面也是读代码,那倒不如慢慢研读,好好把握当下呢。
首先我见识了作者用宏的威力,把宏这样用,比如:
  if (argc > 0)
    {
#if defined (V9_ECHO)
     此处省略若干句
      else
#endif /* V9_ECHO */
 {
   while (argc > 0)
     {
       fputs (argv[0], stdout);
       argc--;
       argv++;
       if (argc > 0)
  putchar (' ');
     }
 }
    }
作者把宏用成这样,我算服了。
我特意加了打印语句,发现程序执行的就是else那一段。
至于main主程序前面很复杂的逻辑,是为了解析出命令行参数,作者没有用getopt函数。
  --argc;
  ++argv;
  while (argc > 0 && *argv[0] == '-')
    {
      register char *temp;
      register int i;
      /* If it appears that we are handling options, then make sure that
  all of the options specified are actually valid.  Otherwise, the
  string should just be echoed. */
      temp = argv[0] + 1;
      for (i = 0; temp[i]; i++)
 {
   if (strrchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
     goto just_echo;
 }
      if (!*temp)
 goto just_echo;
      /* All of the options in TEMP are valid options to ECHO.
  Handle them. */
      while (*temp)
 {
   if (allow_options && *temp == 'n')
     display_return = 0;
#if defined (V9_ECHO)
   else if (allow_options && *temp == 'e')
     do_v9 = 1;
# if defined (V9_DEFAULT)
   else if (allow_options && *temp == 'E')
     do_v9 = 0;
# endif /* V9_DEFAULT */
#endif /* V9_ECHO */
   else
     goto just_echo;
   temp++;
 }
      argc--;
      argv++;
    }
作者的思路,就是找命令字符,若找到就跳出来执行。
我看程序,主要想先观其大略。
coreutils-4.5.1写得真好,我更换低版本的编译器后,进入src子目标,每次修改了程序,
sudo make
进行编译,再执行命令,如
./echo a b c
之类,相当有效率。尤其是,我还装了个tmux,每次把屏幕分成左右两半,右边看代码,和修改,左边呢,进行编译,执行命令,可以win10下,ubuntu不能方便的把代码拷出来,所以写文章时,还得回windows下,进行编辑。编好了,直接发布到csdn上。csdn上还有人读,看着积分上去,也觉得很好玩。

猜你喜欢

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