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