linux中wc是怎么实现的

2017-04-25  本文已影响0人  HHMC

为什么会写这篇文章

Unix中很多地方都涉及到文本处理,经常会涉及到 line , word , sentence , paragraph 等概念。而这里面就涉及到一些含义,但是这些含义好像是模糊不清的,所以写了这篇文章。

wc中 line 和 character

wc程序完成 line word character计数,但是什么是line,什么是character,什么又是word

首先说 line 和 character:
在stackoverflow中有这样一个问题:why should text files end with a newline?中有提到POSIX定义了line为

A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

然后出现了一个有意思的现象
所以在linux中touch 一个新文件,然后使用wc程序,显示 lines=0, characters=0;
然后使用vi打开文件,使用 i 进入 insertmode,然后输入一个字符,然后 :wq,然后使用wc程序,显示lines=1 character=2。
产生这个现象的原因就是文件末尾会自动添加一个newline character。

wc 中 word :

在Google中搜寻 wc source code,然后发现了两个比较有意思的搜索结果:

  1. https://www.gnu.org/software/cflow/manual/html_node/Source-of-wc-command.html#Source-of-wc-command
  2. http://code.metager.de/source/xref/gnu/coreutils/src/wc.c

第一个是GNU cflow项目中的一个demo程序,比较简单,但是有点小遗憾,里面功能实现不全,而且使用gcc编译还有warning。
第二个是看网页上xref可以知道在GNU CoreUtils网站中下载压缩包,然后在压缩包里面找到src/wc.c。

先分析一下第一个中的代码

···
int main (int argc, char **argv)
{
int i;
if (argc < 2)
errf ("usage: wc FILE [FILE...]");

for (i = 1; i < argc; i++)
    counter (argv[i]);

if (argc > 2)
    report ("total", total_ccount, total_wcount, total_lcount);
return 0;

}
···
main中实现了主要功能,调用了数一个文件中有多少lines,words,characters的函数count

然后比较关键的代码是getword函数,不停的从file stream中得到words
其中COUNT完成lines和characters计数,getword函数完成words计数功能。

这个代码对word计数与linux中wc计数不同,我认为主要原因是
这段代码只将连续的字母作为一个字,连续的数字等不作为word
isword用来判断当前字符是否处于一个字,isword实现的功能不完善

再来分析第二个代码

第二个代码相对就有700行之多,先挖个坑,以后学习点内核知识 再来填 coreutils的坑

上一篇下一篇

猜你喜欢

热点阅读