static void pop_input (void) { input_block *tmp = isp->prev; switch (isp->type) { case INPUT_STRING: case INPUT_MACRO: break; case INPUT_FILE: if (debug_level & DEBUG_TRACE_INPUT) DEBUG_MESSAGE2 ("input reverted to %s, line %d", isp->u.u_f.name, isp->u.u_f.lineno); fclose (isp->u.u_f.file); current_file = isp->u.u_f.name; current_line = isp->u.u_f.lineno; output_current_line = isp->u.u_f.out_lineno; start_of_input_line = isp->u.u_f.advance_line; if (tmp != NULL) output_current_line = -1; break; default: M4ERROR ((warning_status, 0, "INTERNAL ERROR: Input stack botch in pop_input ()")); abort (); } obstack_free (current_input, isp); next = NULL; /* might be set in push_string_init () */ isp = tmp; }
FILE * m4_path_search (const char *file, char **result) { FILE *fp; includes *incl; char *name; /* buffer for constructed name */ int e; if (result) *result = NULL; /* Reject empty file. */ if (!*file) { errno = ENOENT; return NULL; } /* Look in current working directory first. */ fp = m4_fopen (file); if (fp != NULL) { if (result) *result = xstrdup (file); return fp; } /* If file not found, and filename absolute, fail. */ if (IS_ABSOLUTE_FILE_NAME (file) || no_gnu_extensions) return NULL; e = errno; for (incl = dir_list; incl != NULL; incl = incl->next) { name = mfile_name_concat (incl->dir, file, NULL); #ifdef DEBUG_INCL xfprintf (stderr, "m4_path_search (%s) -- trying %s\n", file, name); #endif fp = m4_fopen (name); if (fp != NULL) { if (debug_level & DEBUG_TRACE_PATH) DEBUG_MESSAGE2 ("path search for `%s' found `%s'", file, name); if (result) *result = name; else free (name); return fp; } free (name); } errno = e; return fp; }
static void pop_input (void) { input_block *tmp = isp->prev; switch (isp->type) { case INPUT_STRING: case INPUT_MACRO: break; case INPUT_FILE: if (debug_level & DEBUG_TRACE_INPUT) { if (tmp) DEBUG_MESSAGE2 ("input reverted to %s, line %d", tmp->file, tmp->line); else DEBUG_MESSAGE ("input exhausted"); } if (ferror (isp->u.u_f.fp)) { M4ERROR ((warning_status, 0, "read error")); if (isp->u.u_f.close) fclose (isp->u.u_f.fp); retcode = EXIT_FAILURE; } else if (isp->u.u_f.close && fclose (isp->u.u_f.fp) == EOF) { M4ERROR ((warning_status, errno, "error reading file")); retcode = EXIT_FAILURE; } start_of_input_line = isp->u.u_f.advance; output_current_line = -1; break; default: M4ERROR ((warning_status, 0, "INTERNAL ERROR: input stack botch in pop_input ()")); abort (); } obstack_free (current_input, isp); next = NULL; /* might be set in push_string_init () */ isp = tmp; input_change = true; }
static void file_clean(void) { if (debug_level & DEBUG_TRACE_INPUT) DEBUG_MESSAGE2 ("Input reverted to %s, line %d", isp->u.u_f.name, isp->u.u_f.lineno); fclose (isp->u.u_f.file); /* A common mistake is to forget closing some complex tags, which result in an error `file: EOF when reading body of...' If file name has been changed by <__file__>, this name should appear in error message instead of real file name. */ if (isp->prev != NULL) { xfree ((voidstar) current_file); current_file = xstrdup (isp->u.u_f.name); } xfree ((voidstar) isp->u.u_f.name); current_line = isp->u.u_f.lineno; output_current_line = isp->u.u_f.out_lineno; start_of_input_line = isp->u.u_f.advance_line; if (isp->prev != NULL) output_current_line = -1; }