在写一个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时的路径,当字符串处理完毕,结果也就出来了。

 

这些目前只是构思,可能还有没考虑的地方,源码随后奉上。