scripts/docproc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following functions.
  1. main

#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[])
/* [<][>][^][v][top][bottom][index][help] */
{
        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);
}

/* [<][>][^][v][top][bottom][index][help] */