1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7
8 /*
9 * A simple filter for the templates
10 */
11
main(int argc,char * argv[])12 int main(int argc, char *argv[])
13 {
14 char buf[1024];
15 char *vec[8192];
16 char *fvec[200];
17 char **svec;
18 char type[64];
19 int i;
20 int vp=2;
21 int ret=0;
22 pid_t pid;
23
24
25 if(chdir(getenv("TOPDIR")))
26 {
27 perror("chdir");
28 exit(1);
29 }
30
31 /*
32 * Build the exec array ahead of time.
33 */
34 vec[0]="kernel-doc";
35 vec[1]="-docbook";
36 for(i=1;vp<8189;i++)
37 {
38 if(argv[i]==NULL)
39 break;
40 vec[vp++]=type;
41 vec[vp++]=argv[i];
42 }
43 vec[vp++]=buf+2;
44 vec[vp++]=NULL;
45
46 /*
47 * Now process the template
48 */
49
50 while(fgets(buf, 1024, stdin))
51 {
52 if(*buf!='!') {
53 printf("%s", buf);
54 continue;
55 }
56
57 fflush(stdout);
58 svec = vec;
59 if(buf[1]=='E')
60 strcpy(type, "-function");
61 else if(buf[1]=='I')
62 strcpy(type, "-nofunction");
63 else if(buf[1]=='F') {
64 int snarf = 0;
65 fvec[0] = "kernel-doc";
66 fvec[1] = "-docbook";
67 strcpy (type, "-function");
68 vp = 2;
69 for (i = 2; buf[i]; i++) {
70 if (buf[i] == ' ' || buf[i] == '\n') {
71 buf[i] = '\0';
72 snarf = 1;
73 continue;
74 }
75
76 if (snarf) {
77 snarf = 0;
78 fvec[vp++] = type;
79 fvec[vp++] = &buf[i];
80 }
81 }
82 fvec[vp++] = &buf[2];
83 fvec[vp] = NULL;
84 svec = fvec;
85 } else
86 {
87 fprintf(stderr, "Unknown ! escape.\n");
88 exit(1);
89 }
90 switch(pid=fork())
91 {
92 case -1:
93 perror("fork");
94 exit(1);
95 case 0:
96 execvp("scripts/kernel-doc", svec);
97 perror("exec scripts/kernel-doc");
98 exit(1);
99 default:
100 waitpid(pid, &ret ,0);
101 }
102 }
103 exit(ret);
104 }
105