Loading...
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #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); } |