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的大小。