home *** CD-ROM | disk | FTP | other *** search
-
- #line 641 "nuweb.w"
- #include "global.h"
-
- #line 2311 "nuweb.w"
- static FILE *source_file; /* the current input file */
- static int source_peek;
- static int double_at;
- static int include_depth;
-
- #line 2320 "nuweb.w"
- #define MAX_INCLUDES 16
- static struct {
- FILE *file;
- char *name;
- int line;
- } stack[MAX_INCLUDES];
-
- #line 2338 "nuweb.w"
- int source_get(void)
- {
- int c = source_peek;
- switch (c) {
- case EOF:
- #line 2454 "nuweb.w"
- {
- fclose(source_file);
- if (include_depth) {
- include_depth--;
- source_file = stack[include_depth].file;
- source_line = stack[include_depth].line;
- source_name = stack[include_depth].name;
- source_peek = getc(source_file);
- c = source_get();
- }
- }
-
- #line 2342 "nuweb.w"
-
- return c;
- case '@':
- #line 2374 "nuweb.w"
- {
- c = getc(source_file);
- if (double_at) {
- source_peek = c;
- double_at = FALSE;
- c = '@';
- }
- else
- switch (c) {
- case 'i':
- #line 2403 "nuweb.w"
- {
- char name[256];
- if (include_depth >= MAX_INCLUDES) {
- fprintf(stderr, "%s: include nesting too deep (%s, %d)\n",
- command_name, source_name, source_line);
- exit(-1);
- }
-
- #line 2430 "nuweb.w"
- {
- char *p = name;
- do
- c = getc(source_file);
- while (c == ' ' || c == '\t');
- while (isgraph(c)) {
- *p++ = c;
- c = getc(source_file);
- }
- *p = '\0';
- if (c != '\n') {
- fprintf(stderr, "%s: unexpected characters after file name (%s, %d)\n",
- command_name, source_name, source_line);
- exit(-1);
- }
- }
-
- #line 2410 "nuweb.w"
-
- stack[include_depth].name = source_name;
- stack[include_depth].file = source_file;
- stack[include_depth].line = source_line + 1;
- include_depth++;
- source_line = 1;
- source_name = save_string(name);
- source_file = fopen(source_name, "r");
- if (!source_file) {
- fprintf(stderr, "%s: can't open include file %s\n",
- command_name, source_name);
- exit(-1);
- }
- source_peek = getc(source_file);
- c = source_get();
- }
-
- #line 2383 "nuweb.w"
-
- break;
- case 'f': case 'm': case 'u':
- case 'd': case 'o': case 'D': case 'O':
- case '{': case '}': case '<': case '>': case '|':
- source_peek = c;
- c = '@';
- break;
- case '@': source_peek = c;
- double_at = TRUE;
- break;
- default: fprintf(stderr, "%s: bad @ sequence (%s, line %d)\n",
- command_name, source_name, source_line);
- exit(-1);
- }
- }
-
- #line 2344 "nuweb.w"
-
- return c;
- case '\n': source_line++;
- default: source_peek = getc(source_file);
- return c;
- }
- }
-
- #line 2359 "nuweb.w"
- int source_next(void)
- {
- return source_peek;
- }
-
- #line 2476 "nuweb.w"
- void source_open(char *name)
- {
- source_file = fopen(name, "r");
- if (!source_file) {
- fprintf(stderr, "%s: couldn't open %s\n", command_name, name);
- exit(-1);
- }
- source_name = name;
- source_line = 1;
- source_peek = getc(source_file);
- double_at = FALSE;
- include_depth = 0;
- }
-