GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
继续分析手里现在这个shell例程中的一些设计,这次看一下gettoken函数的实现。
前面分析peek的时候已经看过一些类似的处理了,因此这里的这一段代码一看其实哈市很容易理解的。首先,这个函数也进行了指定字符串的清楚空白处理。然后,判断第三个传入参数是否是非NULL的结果,如果是会记录一下这里的位置。同时,返回值先记录当前的指针位置,也就是第一个非空白的字符。
继续往下,其实是针对第一个非空字符进行分类处理。这里比较特殊的几个字符是0、|、<、>。0是什么具体的概念暂且不是很明确,但是另外三个其实是shell中的管道以及重定向。
如果不是上面的几个特殊字符,那么默认是把返回值标记为字符a,同时进行另一轮的去空白并且去<、>、|这是哪个字符处理。
看到这里的eq,结合前面的q基本上就知道这两个参数的作用了。这两个参数其实是为了能够标注这一轮处理中处理的有效字符的开始以及结束位置。
上面的信息记录结束之后,对于剩余的字符进行了新的去除空白操作处理。
这样,这一次的函数设计分析就基本实现了。现在看代码的过程中能够感觉到越来越顺利了,因为通过一个个函数的分析现在掌握的基本语素积累是越来越多了。同时,几个分支以及雷同的处理让我想到了之前看过的SICP的一些处理理念。其实,类似的函数设计可以通过递归的设计理念把软件的可读性提升上去。如果有足够的时间,我倒是有想法去尝试一下。不过现在是陷入到这个课程学习中时间很久了,我希望能够快点闯关看到一些更有趣的其他东西。