c/c++研究和学习

lcc源码学习(6)

help函数简单输出使用帮助信息。如果环境变量LCCDIR、include、lib有定义,也显示他们的内容。

concat函数连接两个字符串,返回连接后的字符串。

error函数格式化输出错误信息,并对错误计数加1。

first函数返回字符串参数list里以分号分割的第一部分,如果字符串不含分号,返回原来的串。

compose:

1 static void compose(char *cmd[], List a, List b, List c) {
2     int i, j;
3     List lists[3];
4 
5     lists[0] = a;
6     lists[1] = b;
7     lists[2] = c;
8     for (i = j = 0; cmd[i]; i++) {
9         char *s = strchr(cmd[i], '$');
10         if (s && isdigit(s[1])) {
11             int k = s[1] - '0';
12             assert(k >=1 && k <= 3);
13             if (b = lists[k-1]) {
14                 b = b->link;
15                 av[j] = alloc(strlen(cmd[i]) + strlen(b->str) - 1);
16                 strncpy(av[j], cmd[i], s - cmd[i]);
17                 av[j][s-cmd[i]] = '\0';
18                 strcat(av[j], b->str);
19                 strcat(av[j++], s + 2);
20                 while (b != lists[k-1]) {
21                     b = b->link;
22                     assert(j < ac);
23                     av[j++] = b->str;
24                 };
25             }
26         } else if (*cmd[i]) {
27             assert(j < ac);
28             av[j++] = cmd[i];
29         }
30     }
31     av[j] = NULL;
32 }

这个函数的作用是组合出用来调用系统程序的命令行参数。结果放在全局变量av中。

例如:在win32.c中定义有变量char *cpp[] = { LCCDIR "cpp", "-D__STDC__=1", "-Dwin32", "-D_WIN32", "-D_M_IX86", "$1", "$2", "$3", 0 };这是调用外部程序cpp.exe的框架,其中$1、$2、$3需要被用户在运行时环境变量和命令行参数所替换。前面阅读时,已经分析了如何取得环境变量和命令行参数,并把取得的值存入一个个List中。这里就是用这些List来替换$1、$2、$3,从而产生完整的调用参数表。

这里需要注意的是,每一个$替换时,不是一项换一项,而是把对应的List中的字符串逐项插入到$位置。例如List a中有n个节点,将$1替换成n个字符串。程序中20-24行的循环就是替换List中后续节点。也就是说av的大小是不确定的,根据替换的需要实际动态生成av的大小。

posted on 2008-11-01 11:04 昆仑大鹏 阅读(868) 评论(1)  编辑 收藏 引用 所属分类: lcc 源码学习

评论

# re: lcc源码学习(6) 2011-03-17 19:43 marx158

怎么不继续分析了呢?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理