接着看。
这个程序呢,
main前面,判断参数个数,argc刚好2个或3个时,程序不报错,否则报错,两个例如:
basename /home/mm
三个例如
basename /home/mm/nnok nn
main中最重要的一句是
name = base_name (argv[1]);
其中若有第三个参数,处理如下:
if (argc == 3)
remove_suffix (name, argv[2]);
子程序我没看懂。下次去细究。
我感兴趣的是,base_name如何处理,因为我的当前目录是core4.5.1/src
在vim中加入
:set tags=./tags,../tags,../lib/src
然后跳到base_name的具体处理。
char *
base_name (char const *name)
{
char const *base = name + FILESYSTEM_PREFIX_LEN (name);
char const *p;
for (p = base; *p; p++)
{
if (ISSLASH (*p))
{
/* Treat multiple adjacent slashes like a single slash. */
do p++;
while (ISSLASH (*p));
{
if (ISSLASH (*p))
{
/* Treat multiple adjacent slashes like a single slash. */
do p++;
while (ISSLASH (*p));
/* If the file name ends in slash, use the trailing slash as
the basename if no non-slashes have been found. */
if (! *p)
{
if (ISSLASH (*base))
base = p - 1;
break;
}
the basename if no non-slashes have been found. */
if (! *p)
{
if (ISSLASH (*base))
base = p - 1;
break;
}
/* *P is a non-slash preceded by a slash. */
base = p;
}
}
base = p;
}
}
return (char *) base;
}
这段代码很有意思,我开始加入printf语句,想打印调度信息,打印不出来。于是就细读
这段代码有意思的地方是,base是指向找出来的非/字符。比如*name="/root/etc"
那么,base先指向"root/etc"
接着找出第二个/后,指向"etc"
也就是说,base存储最后找到的那个非/字符串地址。
./basename /root/etc/
返回为
etc
而不是空,原因就在于循环语句中的
}
这段代码很有意思,我开始加入printf语句,想打印调度信息,打印不出来。于是就细读
这段代码有意思的地方是,base是指向找出来的非/字符。比如*name="/root/etc"
那么,base先指向"root/etc"
接着找出第二个/后,指向"etc"
也就是说,base存储最后找到的那个非/字符串地址。
./basename /root/etc/
返回为
etc
而不是空,原因就在于循环语句中的
/* *P is a non-slash preceded by a slash. */
base = p;
我看不懂英语,只是读代码。
这个很好玩。写代码的是高人呀。
base = p;
我看不懂英语,只是读代码。
这个很好玩。写代码的是高人呀。