home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / src / mkdoc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  4.5 KB  |  228 lines

  1. #include <stdio.h>
  2. FILE *Fpin = stdin;
  3. FILE *Fpout = stdout;
  4.  
  5. #define SKIP_TO(x) while (c = getc(Fpin), (c != EOF) && (c != (x)))
  6. #define SKIP_WHITE while (c = getc(Fpin), (c == ' ') || (c == '\t'))
  7.  
  8. void do_sl_file()
  9. {
  10.    int c = '\n';
  11.    int type, n;
  12.  
  13.    /* looking for this format:  ) function ;%% doc... */
  14.    while (c != EOF)
  15.      {
  16.     while ((c != '\n') && (c != EOF)) c = getc(Fpin);
  17.     n = 0;
  18.     while (1)
  19.       {
  20.          SKIP_WHITE;
  21.          if (c != ';') break;
  22.          if (getc(Fpin) != '%') break;
  23.          if (getc(Fpin) != '%') break;
  24.          SKIP_WHITE;
  25.          n = 1;
  26.          if (c == EOF) break;
  27.          do
  28.            {
  29.           putc(c, Fpout);
  30.            }
  31.          SKIP_TO('\n');
  32.          putc(1, Fpout);
  33.       }
  34.     if (n) putc('\n', Fpout);
  35.      }
  36. }
  37.  
  38.          
  39.     
  40.     
  41.  
  42. void do_c_file()
  43. {
  44.    int c = '\n';
  45.    int type; 
  46.    
  47.    while (c != EOF)
  48.      {
  49.     while ((c != '\n') && (c != EOF)) c = getc(Fpin);
  50.     
  51.     SKIP_WHITE;
  52.     
  53.     if (c != 'a') continue;    c = getc(Fpin);
  54.     if (c != 'd') continue;    c = getc(Fpin);
  55.     if (c != 'd') continue;    c = getc(Fpin);
  56.     if (c != '_') continue;    c = getc(Fpin);    
  57.     if (c == 'i')
  58.       {
  59.          c = getc(Fpin);
  60.          if (c != 'n') continue;    c = getc(Fpin);
  61.          if (c != 't') continue;    c = getc(Fpin);
  62.          if (c != 'r') continue;    c = getc(Fpin);
  63.          if (c != 'i') continue;    c = getc(Fpin);
  64.          if (c != 'n') continue;    c = getc(Fpin);
  65.          if (c != 's') continue;    c = getc(Fpin);
  66.          if (c != 'i') continue;    c = getc(Fpin);
  67.          if (c != 'c') continue;
  68.          type = 'f';
  69.          putc('F', Fpout);
  70.       }
  71.     else if (c != 'v') continue;
  72.     else
  73.       {
  74.          c = getc(Fpin);
  75.          if (c != 'a') continue;    c = getc(Fpin);
  76.          if (c != 'r') continue;    c = getc(Fpin);
  77.          if (c != 'i') continue;    c = getc(Fpin);
  78.          if (c != 'a') continue;    c = getc(Fpin);
  79.          if (c != 'b') continue;    c = getc(Fpin);
  80.          if (c != 'l') continue;    c = getc(Fpin);
  81.          if (c != 'e') continue;
  82.          type = 'v';
  83.          putc('V', Fpout);
  84.       }
  85.    
  86.     SKIP_WHITE;
  87.     if (c != '(') continue;
  88.     SKIP_WHITE;
  89.     if (c != '"') continue;
  90.     
  91.     SKIP_TO('"')
  92.       {
  93.          if (c == '\\')
  94.            {
  95.           c = getc(Fpin);
  96.           if ((c != '"') && (c != '\\')) putc('\\', Fpout);
  97.            }
  98.          putc(c, Fpout);
  99.       }
  100.    
  101.     fflush(Fpout);
  102.     if (type == 'f')  /* get function, parameter number and return type */
  103.       {
  104.          /* example:
  105.          add_intrinsic("coreleft", (long) show_memory,VOID_TYPE, 0); */
  106.          
  107.          SKIP_TO(')');  /* (long) */
  108.          SKIP_WHITE;
  109.          putc(':', Fpout);
  110.          putc(c, Fpout);
  111.          SKIP_TO(',')
  112.            {
  113.           putc(c, Fpout);
  114.            }
  115.          putc(':', Fpout);
  116.          SKIP_WHITE;
  117.          putc(c, Fpout);  /* type: V,S,I (void, string , integer ) */
  118.          SKIP_TO(',');
  119.          putc(':', Fpout);
  120.          SKIP_WHITE;
  121.          if (c != EOF) putc(c, Fpout);  /* number of parameters */
  122.       }   
  123.     putc(1, Fpout);
  124.     /* get doc string */
  125.     SKIP_TO('\n');
  126.     SKIP_WHITE;
  127.     
  128.     /* doc follows / * ;; syntax */
  129.    
  130.     if (c != '/')
  131.       {
  132.          ungetc(c, Fpin); c = '\n';
  133.          putc('\n', Fpout);
  134.          continue;
  135.       }
  136.     c = getc(Fpin);
  137.     if (c != '*') 
  138.       {
  139.          putc('\n', Fpout);
  140.          continue;
  141.       }
  142.     
  143.     while (1)
  144.       {
  145.          SKIP_WHITE;
  146.          if (c != ';') break;
  147.          c = getc(Fpin);
  148.          if (c != ';') break;
  149.          SKIP_TO('\n') putc(c, Fpout);
  150.          putc(1, Fpout);  /* literal ^A to separate lines */
  151.       }
  152.     ungetc(c, Fpin);
  153.     c = '\n';
  154.     putc('\n', Fpout);
  155.      }
  156. }
  157.  
  158. int process_file(char *file)
  159. {
  160.    if ((Fpin = fopen(file,"r")) == NULL) return(0);
  161. /*   do_sl_file(); */
  162.    do_c_file(); 
  163.    fclose(Fpin);
  164. }
  165.  
  166. void do_filelist(char *file)
  167. {
  168.    char line[512], *chp, *linep;
  169.    FILE *fp;
  170.    
  171.    if (NULL == (fp = fopen(file, "r")))
  172.      {
  173.     fprintf(stderr, "unable to open input file: %s\n", file);
  174.     exit(1);
  175.      }
  176.    
  177.    while(NULL != fgets(line, 511, fp))
  178.      {
  179.     if (*line == '#') continue;
  180.     linep = line;
  181.     while(*linep && (*linep <= ' ')) linep++;
  182.     chp = linep;
  183.     while (*chp > ' ') chp++;
  184.     *chp = 0;
  185.     if (! *linep) continue; 
  186.     if (!process_file(linep))
  187.       {
  188.          fprintf(stderr, "Unable to open %s\n", linep);
  189.       }
  190.      }
  191.    fclose(fp);
  192. }
  193.  
  194. void usage(void)
  195. {
  196.    fprintf(stderr, "mkdoc [-o docfile] [-i filelist] [file1 ...]\n");
  197.    exit(1);
  198. }
  199.  
  200. int main(int argc, char **argv)
  201. {
  202.    int i;
  203.    char *arg;
  204.    
  205.    if (argc < 2) usage();
  206.    
  207.    for (i = 1; i < argc; )
  208.      {
  209.     arg = argv[i++];
  210.     if ((i != argc) && !strcmp(arg, "-i"))
  211.       {
  212.          do_filelist(argv[i++]);
  213.       }
  214.     else if ((i != argc) && !strcmp(arg, "-o"))
  215.       {
  216.          if ((Fpout != NULL) && (Fpout != stdout)) fclose(Fpout);
  217.          if ((Fpout = fopen(argv[i++], "w")) == NULL)
  218.            {
  219.           fprintf(stderr, "Unable to open output file %s\n", argv[i - 1]);
  220.           exit(1);
  221.            }
  222.       } 
  223.     else process_file(arg);
  224.      }
  225.    exit(0);
  226.    return(0);
  227. }
  228.