gnu coreutils basename.c源码分析

107 篇文章 1 订阅
95 篇文章 1 订阅

接着看。
这个程序呢,
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 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;
     }
   /* *P is a non-slash preceded by a slash.  */
   base = p;
 }
    }
  return (char *) base;
}
这段代码很有意思,我开始加入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;
我看不懂英语,只是读代码。
这个很好玩。写代码的是高人呀。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值