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 (' ');
}
}
}
作者把宏用成这样,我算服了。
{
#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;
至于main主程序前面很复杂的逻辑,是为了解析出命令行参数,作者没有用getopt函数。
--argc;
++argv;
while (argc > 0 && *argv[0] == '-')
{
register char *temp;
register int i;
{
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;
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 (strrchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
goto just_echo;
}
if (!*temp)
goto just_echo;
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;
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上还有人读,看着积分上去,也觉得很好玩。
}
argc--;
argv++;
}
作者的思路,就是找命令字符,若找到就跳出来执行。
我看程序,主要想先观其大略。
coreutils-4.5.1写得真好,我更换低版本的编译器后,进入src子目标,每次修改了程序,
sudo make
进行编译,再执行命令,如
./echo a b c
之类,相当有效率。尤其是,我还装了个tmux,每次把屏幕分成左右两半,右边看代码,和修改,左边呢,进行编译,执行命令,可以win10下,ubuntu不能方便的把代码拷出来,所以写文章时,还得回windows下,进行编辑。编好了,直接发布到csdn上。csdn上还有人读,看着积分上去,也觉得很好玩。