home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / src / common / doincl.c < prev    next >
C/C++ Source or Header  |  2001-12-12  |  2KB  |  78 lines

  1. /*
  2.  * doincl.c -- expand include directives (recursively)
  3.  *
  4.  *  Usage:  doinclude [-o outfile] filename...
  5.  *
  6.  *  Doinclude copies a C source file, expanding non-system include directives.
  7.  *  For each line of the form
  8.  *    #include "filename"
  9.  *  the named file is interpolated; all other lines are copied verbatim.
  10.  *
  11.  *  No error is generated if a file cannot be opened.
  12.  */
  13.  
  14. #include "../h/rt.h"
  15.  
  16. void    doinclude    (char *fname);
  17.  
  18. #define MAXLINE 500    /* maximum line length */
  19.  
  20. FILE *outfile;        /* output file */
  21.  
  22. int main(argc, argv)
  23. int argc;
  24. char *argv[];
  25.    {
  26.    char *progname = argv[0];
  27.  
  28.    outfile = stdout;
  29.    if (argc > 3 && strcmp(argv[1], "-o") == 0) {
  30.       if ((outfile = fopen(argv[2], "w")) != NULL) {
  31.          argv += 2;
  32.          argc -= 2;
  33.          }
  34.       else {
  35.          perror(argv[2]);
  36.          exit(1);
  37.          }
  38.       }
  39.    if (argc < 2) {
  40.       fprintf(stderr, "usage: %s [-o outfile] filename...\n", progname);
  41.       exit(1);
  42.       }
  43.  
  44.    fprintf(outfile,
  45.       "/***** do not edit -- this file was generated mechanically *****/\n\n");
  46.    while (--argc > 0)
  47.       doinclude(*++argv);
  48.    exit(0);
  49.    /*NOTREACHED*/
  50.    }
  51.  
  52. void doinclude(fname)
  53. char *fname;
  54.    {
  55.    FILE *f;
  56.    char line[MAXLINE], newname[MAXLINE], *p;
  57.  
  58.    fprintf(outfile, "\n\n/****************************************");
  59.    fprintf(outfile, "  from %s:  */\n\n", fname);
  60.    if ((f = fopen(fname, "r")) != NULL) {
  61.       while (fgets(line, MAXLINE, f))
  62.          if (sscanf(line, " # include \"%s\"", newname) == 1) {
  63.             for (p = newname; *p != '\0' && *p != '"'; p++)
  64.                ;
  65.             *p = '\0';                /* strip off trailing '"' */
  66.             doinclude(newname);            /* include file */
  67.             }
  68.          else
  69.             fputs(line, outfile);        /* not an include directive */
  70.       fclose(f);
  71.       }
  72.    else {
  73.       fprintf(outfile, "/* [file not found] */\n");
  74.       }
  75.    fprintf(outfile, "\n/****************************************");
  76.    fprintf(outfile, "   end %s   */\n", fname);
  77.    }
  78.