一个这样的程序前面就需要定义那么多的函数,想想也有点夸张.
主函数控制整体流程,
getword函数读取输入的字符串.
然后进行分析.
如果输入的字符串开头是'#'(这是因为strcmp查到'\0'就结束不再向下对比.所以只对比了开头的'#',只要开头都是'#'判断式就为真.).
执行getdef函数.
否则如果开头首字符不是字母.
输出这个字符串.
否则如果调用lookup函数在链表里查找字符串没有找到.
输出这个字符串.
最后.
将p指向的块的定义内容放回缓冲区.
主函数先到这,有一部分不知道怎么回事等会再说.
再看getdef函数.
开头是skipblanks函数,跳过空白符.
然后依然通过getword函数读取'#'之后的单词.并判断首字符是不是字母.不是字母输出错误信息.
如果是字母,判断是"defien"还是"undef"都不是的话输出错误信息(因为getword返回值为首字符,所以只能判断首字符是不是字母.)
如果是"define"或者"undef"的话.跳过空白符之后继续判断定义的首字符是不是字母.首字符不是字母依然输出错误信息.并且将读取的定义的名字放在变量name中.
判断是"define"后,通过getch()函数从缓冲区读取定义的替换文本.
读取到末尾(遇到换行符或文件结束符.)
在结尾加上空字符'\0'.
然后判断读取的字符数量.小于等于0就是没有读取到.肯定是错误的.
读取到的话就调用install函数将名字的替换文本放入链表中.
如果是"undef"也一样而且更简单.符合条件直接调用"undef"函数.
error函数会把产生错误的那一行直接吃了.后续不会在继续判断.因为是错误的.
skipblanks函数很简单就是跳过空白符.