home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 3: The Continuation / 17-Bit_The_Continuation_Disc.iso / files / nz18.dms / nz18.adf / Fxu.c < prev    next >
C/C++ Source or Header  |  1993-12-03  |  5KB  |  179 lines

  1. /*
  2.  * name         fxu -- function extract utility
  3.  *
  4.  * usage        fxu filename function
  5.  *
  6.  *              where "filename" is the name of a file containing
  7.  *              several C functions, and "function" is the name of
  8.  *              the particular function to be extracted.  If the
  9.  *              named function is found, then (1) standard input is
  10.  *              copied to the standard output until EOF, and (2) the
  11.  *              text of the named function is written to the standard
  12.  *              output.  The first option allows header information
  13.  *              to be prepended to the output file.
  14.  *
  15.  */
  16.  
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. #include <v2tov3.h>
  20.  
  21. #define MAX 16        /* maximum characters in function name */
  22. #define MAXBUF 2000   /* maximum characters buffered between functions */
  23.  
  24. static char symbol[MAX+1];
  25. static char text[MAXBUF];
  26.  
  27.  
  28. char *help_screen[] = {
  29. "",
  30. "Usage: fxu filename function",
  31. "",
  32. "where 'filename' is the name of a file containing",
  33. "several C functions, and 'function' is the name of",
  34. "the particular function to be extracted.  If the",
  35. "named function is found, then (1) standard input is",
  36. "copied to the standard output until EOF, and (2) the",
  37. "text of the named function is written to the standard",
  38. "output.  The first option allows header information",
  39. "to be prepended to the output file.",
  40. "",
  41. 0 };
  42.  
  43. main(argc, argv)
  44. int argc;
  45. char *argv[];
  46. {
  47. int c, brace, cnest, nc;
  48. int i, ns, copy, inlit, delim, pc;
  49. FILE *sfp;
  50.  
  51. if (argc != 3)
  52.    {
  53.    help(help_screen);
  54.    exit(1);
  55.    }
  56. if ((sfp = fopen(argv[1], "r")) == NULL)
  57.    {
  58.    fputs("Can't open source file\n", stderr);
  59.    exit(1);
  60.    }
  61. brace = cnest = nc = ns = copy = inlit = pc = 0;
  62. c = getc(sfp);        /* get first char */
  63. while (c != EOF)
  64.    {                 /* scan through source file */
  65.    if (ns == MAXBUF)
  66.        {
  67.        fputs("Maximum buffer size exceeded\n", stderr);
  68.        exit(1);
  69.        }
  70.    if (copy == 0)
  71.        {
  72.        if (brace == 0) text[ns++] = c;  /* save chars between functions */
  73.        }
  74.    else
  75.        if (putchar(c) == EOF)
  76.            {
  77.            fputs("Copy error\n", stderr);
  78.            exit(1);
  79.            }
  80.    if (c == '/')
  81.        {             /* possible comment */
  82.        nc = 0;
  83.        if ((c = getc(sfp)) == '*')
  84.            {
  85.            ++cnest;   /* bump nesting level */
  86.            if (copy) putchar(c);
  87.            else if (brace == 0) text[ns++] = c;
  88.            c = getc(sfp);
  89.            }
  90.        continue;
  91.        }
  92.    if (cnest != 0)
  93.        {             /* inside comment */
  94.        if (c == '*')
  95.            {
  96.            if ((c = getc(sfp)) == '/')
  97.               {
  98.               --cnest;       /* reduce nesting level */
  99.               if (copy) putchar(c);
  100.               else if (brace == 0) text[ns++] = c;
  101.               c = getc(sfp);
  102.               }
  103.            continue;
  104.            }
  105.        nc = 0;
  106.        }
  107.    else if (inlit)
  108.        {               /* inside literal string */
  109.        if (c == '\\' && pc == '\\') c = 0;
  110.        if (c == delim && pc != '\\') inlit = 0;
  111.        pc = c;         /* save previous character */
  112.        }
  113.    else if (c == '\'' || c == '\"')
  114.        {               /* enter literal string */
  115.        inlit = 1;
  116.        pc = 0;
  117.        delim = c;
  118.        }
  119.    else if (c == '{') ++brace;
  120.    else if (c == '}')
  121.        {             /* right brace */
  122.        nc = 0;
  123.        if (--brace == 0)
  124.            if (copy == 0) ns = 0;      /* reset save index if not found */
  125.            else
  126.                {               /* copy complete */
  127.                putchar('\n');
  128.                exit(0);
  129.                }
  130.        }
  131.    else if (brace == 0)
  132.        {
  133.        if (nc == 0)
  134.            {             /* symbol not started yet */
  135.            if (iscsymf(c))
  136.                symbol[nc++] = c;  /* start new symbol */
  137.            }
  138.        else if (iscsym(c) || c == '$')
  139.                      /* continue symbol */
  140.            if (nc < MAX) symbol[nc++] = c;
  141.            else symbol[0] = '\0';
  142.        else if (nc != 0)
  143.            {             /* end of current symbol */
  144.            symbol[nc++] = '\0';
  145.            if (strcmp(symbol,argv[2]) == 0)
  146.                {               /* named function has been found */
  147.                fputs("\nFunction found, enter header information. Ctrl Z to finish.\n", stderr);
  148.                while ((c = getchar()) != EOF)
  149.                    putchar(c);         /* copy standard input to output */
  150.                for (i = 0; i < ns; i++)
  151.                    putchar(text[i]);           /* copy saved characters */
  152.                copy = 1;       /* turn on copy flag */
  153.                }
  154.            nc = 0;
  155.            }
  156.        }
  157.    c = getc(sfp);      /* get next char */
  158.    }
  159.  
  160. fputs("Named function not found\n", stderr);
  161. exit(1);
  162. }
  163.  
  164. /*****************************************************************************/
  165.  
  166. help(hp)
  167. char **hp;
  168.  
  169. /*
  170.  * Give help
  171.  */
  172.  
  173. {
  174.    register char   **dp;
  175.  
  176.    for (dp = hp; *dp; dp++)
  177.       fprintf(stderr,"%s\n", *dp);
  178. }
  179.