在写一个mk_cscope.sh文件,用于给任意code base目录下的代码建立cscope索引。其主要步骤是:
1. cd 到该目录下
2. ctags -R ./
3. find 所有的.c和.h文件,并生成cscope.files
4. cscope -bR
本来这是一个很简单的问题,将上面的command集成到一个sh文件里即可。但之前竟然想先得到绝对路径,然后再find、cscope...
毫无疑问是不需要这么复杂的。纵然传给脚本的参数是相对路径,也可以在脚本中执行“cd $1”的命令。所以计算绝对路径是绕了一个大弯子,况且计算绝对路径并不那么容易。
但由此而引申出来一个问题,就是绝对路径的计算。 我想应该有两种方式:
1. fullPath=$(cd $dir; pwd)
2. 分析相对路径
相对路径中包含以下几种元素:
1. ./
2. ../
3. /
4. folderNames
相对路径只是上面几种元素按照规则组合而已
1. ./
当前路径,只有元素1
2. ../smDir/ ... /deepDir0
有元素2, 3, 4
3. ./dirInCurDir/./childDir/ ... / deepDir1
有元素1, 3, 4
4. ../currentDir/dirInCurDir/./childDir/ ... / deepDir2
有元素1, 2, 3, 4
5. ~/dirs ...
6. dirInCurDir/ ... /deepDir3
处理方法:
1. 对于这种字符串的处理, 最好的方式就是状态机。
2. 因为这种目录的运算是线性且是双向的,所以最好的结构是双向链表,如下:
1. Define: Header->dir = "/"
2. 根据当前目录,寻找上一层目录,直至根目录"/",从而建立当前目录的链表。
Header->next-> ... ->dir = "currentDir"
3. 根据相对路径进行轮询
pRltPath is splitted by "token" each time
while (sToken = getNextToken(pRltPath))
{
switch(sToken)
{
case "/":
Back to root;
case "./":
Just continue;
case "../":
if pCurDir->dir == "/"
Error();
return 0;
else
Backword;
case "~":
if "~" exist in the link
move to "~";
else
pRltPath = getUsrHome() + pRltpath;
default:
pCurDir->next = sToken; // string copy
}
}
这样,每一步的执行都是计算到字符串某个token时的路径,当字符串处理完毕,结果也就出来了。
这些目前只是构思,可能还有没考虑的地方,源码随后奉上。