c/c++研究和学习

lcc源码学习(5)

callsys:

1 static int callsys(char **av) {
2     int i, status = 0;
3     static char **argv;
4     static int argc;
5 
6     for (i = 0; av[i] != NULL; i++)
7         ;
8     if (i + 1 > argc) {
9         argc = i + 1;
10         if (argv == NULL)
11             argv = malloc(argc*sizeof *argv);
12         else
13             argv = realloc(argv, argc*sizeof *argv);
14         assert(argv);
15     }
16     for (i = 0; status == 0 && av[i] != NULL; ) {
17         int j = 0;
18         char *s;
19         for ( ; av[i] != NULL && (s = strchr(av[i], '\n')) == NULL; i++)
20             argv[j++] = av[i];
21         if (s != NULL) {
22             if (s > av[i])
23                 argv[j++] = stringf("%.*s", s - av[i], av[i]);
24             if (s[1] != '\0')
25                 av[i] = s + 1;
26             else
27                 i++;
28         }
29         argv[j] = NULL;
30         if (verbose > 0) {
31             int k;
32             fprintf(stderr, "%s", argv[0]);
33             for (k = 1; argv[k] != NULL; k++)
34                 fprintf(stderr, " %s", argv[k]);
35             fprintf(stderr, "\n");
36         }
37         if (verbose < 2)
38             status = _spawnvp(_P_WAIT, argv[0], (const char * const *)argv);
39         if (status == -1) {
40             fprintf(stderr, "%s: ", progname);
41             perror(argv[0]);
42         }
43     }
44     return status;
45 }
46 

今天又烦又累,真是不想看了。坚持分析一个函数模块吧。

这个函数实际上是把字符串数组参数av中的字符串组装成一条DOS命令,利用_spawnvp函数调用dos程序,并接受程序执行状态,把执行状态返回。注意这是个static函数,就是说只在当前文件中有效。

其中复杂在处理参数中如果有'\n'字符的话,每个'\n'前面部分组装成一条命令调用,然后循环处理后面部分。返回最后一条命令的返回状态。只是不知道为什么这样处理?也就是调用这个函数的部分,为什么把'\n'组装到字符串数组里,完全可以分多次调用本函数的。这样本函数也将获得简化。等读到相关代码时再说吧。

posted on 2008-10-30 01:00 昆仑大鹏 阅读(541) 评论(0)  编辑 收藏 引用 所属分类: lcc 源码学习


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