docproc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  * A simple filter for the templates
  9.  */
  10. int main(int argc, char *argv[])
  11. {
  12. char buf[1024];
  13. char *vec[8192];
  14. char *fvec[200];
  15. char **svec;
  16. char type[64];
  17. int i;
  18. int vp=2;
  19. int ret=0;
  20. pid_t pid;
  21. if(chdir(getenv("TOPDIR")))
  22. {
  23. perror("chdir");
  24. exit(1);
  25. }
  26. /*
  27.  * Build the exec array ahead of time.
  28.  */
  29. vec[0]="kernel-doc";
  30. vec[1]="-docbook";
  31. for(i=1;vp<8189;i++)
  32. {
  33. if(argv[i]==NULL)
  34. break;
  35. vec[vp++]=type;
  36. vec[vp++]=argv[i];
  37. }
  38. vec[vp++]=buf+2;
  39. vec[vp++]=NULL;
  40. /*
  41.  * Now process the template
  42.  */
  43.  
  44. while(fgets(buf, 1024, stdin))
  45. {
  46. if(*buf!='!') {
  47. printf("%s", buf);
  48. continue;
  49. }
  50. fflush(stdout);
  51. svec = vec;
  52. if(buf[1]=='E')
  53. strcpy(type, "-function");
  54. else if(buf[1]=='I')
  55. strcpy(type, "-nofunction");
  56. else if(buf[1]=='F') {
  57. int snarf = 0;
  58. fvec[0] = "kernel-doc";
  59. fvec[1] = "-docbook";
  60. strcpy (type, "-function");
  61. vp = 2;
  62. for (i = 2; buf[i]; i++) {
  63. if (buf[i] == ' ' || buf[i] == 'n') {
  64. buf[i] = '';
  65. snarf = 1;
  66. continue;
  67. }
  68. if (snarf) {
  69. snarf = 0;
  70. fvec[vp++] = type;
  71. fvec[vp++] = &buf[i];
  72. }
  73. }
  74. fvec[vp++] = &buf[2];
  75. fvec[vp] = NULL;
  76. svec = fvec;
  77. } else
  78. {
  79. fprintf(stderr, "Unknown ! escape.n");
  80. exit(1);
  81. }
  82. switch(pid=fork())
  83. {
  84. case -1:
  85. perror("fork");
  86. exit(1);
  87. case  0:
  88. execvp("scripts/kernel-doc", svec);
  89. perror("exec scripts/kernel-doc");
  90. exit(1);
  91. default:
  92. waitpid(pid, &ret ,0);
  93. }
  94. }
  95. exit(ret);
  96. }