#include #include #include #include #include #include /* * 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; int ret=0; 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, &ret ,0); } } exit(ret); }