home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / n / nuweb / Source / src / input_c < prev    next >
Encoding:
Text File  |  1997-03-13  |  4.9 KB  |  145 lines

  1.  
  2. #line 641 "nuweb.w"
  3. #include "global.h"
  4.  
  5. #line 2311 "nuweb.w"
  6. static FILE *source_file;  /* the current input file */
  7. static int source_peek;
  8. static int double_at;
  9. static int include_depth;
  10.  
  11. #line 2320 "nuweb.w"
  12. #define MAX_INCLUDES 16
  13. static struct {
  14.   FILE *file;
  15.   char *name;
  16.   int line;
  17. } stack[MAX_INCLUDES];
  18.  
  19. #line 2338 "nuweb.w"
  20. int source_get(void)
  21. {
  22.   int c = source_peek;
  23.   switch (c) {
  24.     case EOF:  
  25. #line 2454 "nuweb.w"
  26.                {
  27.                  fclose(source_file);
  28.                  if (include_depth) {
  29.                    include_depth--;
  30.                    source_file = stack[include_depth].file;
  31.                    source_line = stack[include_depth].line;
  32.                    source_name = stack[include_depth].name;
  33.                    source_peek = getc(source_file);
  34.                    c = source_get();
  35.                  }
  36.                }
  37.                
  38. #line 2342 "nuweb.w"
  39.  
  40.                return c;
  41.     case '@':  
  42. #line 2374 "nuweb.w"
  43.                {
  44.                  c = getc(source_file);
  45.                  if (double_at) {
  46.                    source_peek = c;
  47.                    double_at = FALSE;
  48.                    c = '@';
  49.                  }
  50.                  else
  51.                    switch (c) {
  52.                      case 'i': 
  53. #line 2403 "nuweb.w"
  54.                                {
  55.                                  char name[256];
  56.                                  if (include_depth >= MAX_INCLUDES) {
  57.                                    fprintf(stderr, "%s: include nesting too deep (%s, %d)\n",
  58.                                            command_name, source_name, source_line);
  59.                                    exit(-1);
  60.                                  }
  61.                                  
  62. #line 2430 "nuweb.w"
  63.                                  {
  64.                                      char *p = name;
  65.                                      do
  66.                                        c = getc(source_file);
  67.                                      while (c == ' ' || c == '\t');
  68.                                      while (isgraph(c)) {
  69.                                        *p++ = c;
  70.                                        c = getc(source_file);
  71.                                      }
  72.                                      *p = '\0';
  73.                                      if (c != '\n') {
  74.                                        fprintf(stderr, "%s: unexpected characters after file name (%s, %d)\n",
  75.                                                command_name, source_name, source_line);
  76.                                        exit(-1);
  77.                                      }
  78.                                  }
  79.                                  
  80. #line 2410 "nuweb.w"
  81.                                
  82.                                  stack[include_depth].name = source_name;
  83.                                  stack[include_depth].file = source_file;
  84.                                  stack[include_depth].line = source_line + 1;
  85.                                  include_depth++;
  86.                                  source_line = 1;
  87.                                  source_name = save_string(name);
  88.                                  source_file = fopen(source_name, "r");
  89.                                  if (!source_file) {
  90.                                    fprintf(stderr, "%s: can't open include file %s\n",
  91.                                     command_name, source_name);
  92.                                    exit(-1);
  93.                                  }
  94.                                  source_peek = getc(source_file);
  95.                                  c = source_get();
  96.                                }
  97.                                
  98. #line 2383 "nuweb.w"
  99.                
  100.                                break;
  101.                      case 'f': case 'm': case 'u':
  102.                      case 'd': case 'o': case 'D': case 'O':
  103.                      case '{': case '}': case '<': case '>': case '|':
  104.                                source_peek = c;
  105.                                c = '@';
  106.                                break;
  107.                      case '@': source_peek = c;
  108.                                double_at = TRUE;
  109.                                break;
  110.                      default:  fprintf(stderr, "%s: bad @ sequence (%s, line %d)\n",
  111.                                        command_name, source_name, source_line);
  112.                                exit(-1);
  113.                    }
  114.                }
  115.                
  116. #line 2344 "nuweb.w"
  117.  
  118.                return c;
  119.     case '\n': source_line++;
  120.     default:   source_peek = getc(source_file);
  121.                return c;
  122.   }
  123. }
  124.  
  125. #line 2359 "nuweb.w"
  126. int source_next(void)
  127. {
  128.   return source_peek;
  129. }
  130.  
  131. #line 2476 "nuweb.w"
  132. void source_open(char *name)
  133. {
  134.   source_file = fopen(name, "r");
  135.   if (!source_file) {
  136.     fprintf(stderr, "%s: couldn't open %s\n", command_name, name);
  137.     exit(-1);
  138.   }
  139.   source_name = name;
  140.   source_line = 1;
  141.   source_peek = getc(source_file);
  142.   double_at = FALSE;
  143.   include_depth = 0;
  144. }
  145.