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'组装到字符串数组里,完全可以分多次调用本函数的。这样本函数也将获得简化。等读到相关代码时再说吧。