summaryrefslogtreecommitdiffstats
path: root/scripts/docproc.c
blob: 0c23e87c1472315630929e50aeebf904a7c5cf72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

/*
 *	A simple filter for the templates
 */

int main(int argc, char *argv[])
{
	char buf[1024];
	char *vec[1024];
	char type[64];
	int i;
	int vp=2;
	pid_t pid;


	if(chdir(getenv("TOPDIR")))
	{
		perror("chdir");
		exit(1);
	}
	
	/*
	 *	Build the exec array ahead of time.
	 */
	vec[0]="kernel-doc";
	vec[1]="-docbook";
	for(i=1;vp<1021;i++)
	{
		if(argv[i]==NULL)
			break;
		vec[vp++]=type;
		vec[vp++]=argv[i];
	}
	vec[vp++]=buf+2;
	vec[vp++]=NULL;
	
	/*
	 *	Now process the template
	 */
	 
	while(fgets(buf, 1024, stdin))
	{
		if(*buf!='!')
			printf("%s", buf);
		else
		{
			fflush(stdout);
			if(buf[1]=='E')
				strcpy(type, "-function");
			else if(buf[1]=='I')
				strcpy(type, "-nofunction");	
			else
			{
				fprintf(stderr, "Unknown ! escape.\n");
				exit(1);
			}
			switch(pid=fork())
			{
				case -1:
					perror("fork");
					exit(1);
				case  0:
					execvp("scripts/kernel-doc", vec);
					perror("exec");
					exit(1);
				default:
					waitpid(pid, NULL,0);
			}
		}
	}
	exit(0);
}