#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[8192];
	char *fvec[200];
	char **svec;
	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<8189;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);
			continue;
		}

		fflush(stdout);
		svec = vec;
		if(buf[1]=='E')
			strcpy(type, "-function");
		else if(buf[1]=='I')
			strcpy(type, "-nofunction");	
		else if(buf[1]=='F') {
			int snarf = 0;
			fvec[0] = "kernel-doc";
			fvec[1] = "-docbook";
			strcpy (type, "-function");
			vp = 2;
			for (i = 2; buf[i]; i++) {
				if (buf[i] == ' ' || buf[i] == '\n') {
					buf[i] = '\0';
					snarf = 1;
					continue;
				}

				if (snarf) {
					snarf = 0;
					fvec[vp++] = type;
					fvec[vp++] = &buf[i];
				}
			}
			fvec[vp++] = &buf[2];
			fvec[vp] = NULL;
			svec = fvec;
		} else
		{
			fprintf(stderr, "Unknown ! escape.\n");
			exit(1);
		}
		switch(pid=fork())
		{
		case -1:
			perror("fork");
			exit(1);
		case  0:
			execvp("scripts/kernel-doc", svec);
			perror("exec scripts/kernel-doc");
			exit(1);
		default:
			waitpid(pid, NULL,0);
		}
	}
	exit(0);
}
