boolean open_input (FILE **f_ptr, int filefmt, const_string fopen_mode) { string fname = NULL; #ifdef FUNNY_CORE_DUMP /* This only applies if a preloaded TeX/Metafont is being made; it allows automatic creation of the core dump (typing ^\ loses since that requires manual intervention). */ if ((filefmt == kpse_tex_format || filefmt == kpse_mf_format || filefmt == kpse_mp_format) && STREQ (nameoffile + 1, "HackyInputFileNameForCoreDump.tex")) funny_core_dump (); #endif /* We havent found anything yet. */ *f_ptr = NULL; if (fullnameoffile) free(fullnameoffile); fullnameoffile = NULL; /* Look in -output-directory first, if the filename is not absolute. This is because .aux and other such files will get written to the output directory, and we have to be able to read them from there. We only look for the name as-is. */ if (output_directory && !kpse_absolute_p (nameoffile+1, false)) { fname = concat3 (output_directory, DIR_SEP_STRING, nameoffile + 1); *f_ptr = fopen (fname, fopen_mode); if (*f_ptr) { free (nameoffile); namelength = strlen (fname); nameoffile = xmalloc (namelength + 2); strcpy (nameoffile + 1, fname); fullnameoffile = fname; } else { free (fname); } } /* No file means do the normal search. */ if (*f_ptr == NULL) { /* A negative FILEFMT means don't use a path. */ if (filefmt < 0) { /* no_file_path, for BibTeX .aux files and MetaPost things. */ *f_ptr = fopen(nameoffile + 1, fopen_mode); /* FIXME... fullnameoffile = xstrdup(nameoffile + 1); */ } else { /* The only exception to `must_exist' being true is \openin, for which we set `tex_input_type' to 0 in the change file. */ /* According to the pdfTeX people, pounding the disk for .vf files is overkill as well. A more general solution would be nice. */ boolean must_exist = (filefmt != kpse_tex_format || texinputtype) && (filefmt != kpse_vf_format); fname = kpse_find_file (nameoffile + 1, (kpse_file_format_type)filefmt, must_exist); if (fname) { fullnameoffile = xstrdup(fname); /* If we found the file in the current directory, don't leave the `./' at the beginning of `nameoffile', since it looks dumb when `tex foo' says `(./foo.tex ... )'. On the other hand, if the user said `tex ./foo', and that's what we opened, then keep it -- the user specified it, so we shouldn't remove it. */ if (fname[0] == '.' && IS_DIR_SEP (fname[1]) && (nameoffile[1] != '.' || !IS_DIR_SEP (nameoffile[2]))) { unsigned i = 0; while (fname[i + 2] != 0) { fname[i] = fname[i + 2]; i++; } fname[i] = 0; } /* kpse_find_file always returns a new string. */ free (nameoffile); namelength = strlen (fname); nameoffile = xmalloc (namelength + 2); strcpy (nameoffile + 1, fname); free (fname); /* This fopen is not allowed to fail. */ #if defined(PTEX) && !defined(WIN32) if (filefmt == kpse_tex_format || filefmt == kpse_bib_format) { *f_ptr = nkf_open (nameoffile + 1, fopen_mode); } else #endif *f_ptr = xfopen (nameoffile + 1, fopen_mode); } } } if (*f_ptr) { recorder_record_input (nameoffile + 1); /* If we just opened a TFM file, we have to read the first byte, to pretend we're Pascal. See tex.ch and mp.ch. Ditto for the ocp/ofm Omega file formats. */ if (filefmt == kpse_tfm_format) { tfmtemp = getc (*f_ptr); /* We intentionally do not check for EOF here, i.e., an empty TFM file. TeX will see the 255 byte and complain about a bad TFM file, which is what we want. */ } else if (filefmt == kpse_ocp_format) { ocptemp = getc (*f_ptr); } else if (filefmt == kpse_ofm_format) { tfmtemp = getc (*f_ptr); } } return *f_ptr != NULL; }
boolean open_input (FILE ** f, kpse_file_format_type file_fmt, const char * fopen_mode) { boolean openable = false; char * file_name = NULL; #if defined (FUNNY_CORE_DUMP) && !defined (BibTeX) if (file_fmt == kpse_tex_format && strncmp(name_of_file + 1, "HackyInputFileNameForCoreDump.tex", 33) == 0) funny_core_dump(); #endif if (return_flag) { if (strcmp(fopen_mode, "r") == 0) fopen_mode = "rb"; } name_of_file[name_length + 1] = '\0'; /* reinsert '~' and ' ' in file names */ if (pseudo_tilde != 0 || pseudo_space != 0) retwiddle(name_of_file + 1); if (shorten_file_name) check_short_name(name_of_file + 1); if (open_trace_flag) printf(" Open `%s' for input ", name_of_file + 1); file_name = kpse_find_file((const_string) name_of_file + 1, file_fmt, false); if (file_name != NULL) { strcpy ((char *) name_of_file + 1, file_name); *f = xfopen((char *) file_name, fopen_mode); #ifdef _WIN32 if (name_of_file[1] == '.' && (name_of_file[2] == PATH_SEP || name_of_file[2] == '\\')) #else if (name_of_file[1] == '.' && name_of_file[2] == PATH_SEP) #endif { unsigned i = 1; while (name_of_file[i + 2] != '\0') { name_of_file[i] = name_of_file[i + 2]; i++; } name_of_file[i] = '\0'; name_length = i - 1; } else name_length = strlen((char *) name_of_file + 1); if (file_fmt == kpse_tfm_format) { fbyte = getc(*f); } if (strstr((char *) name_of_file + 1, ".fmt") != NULL) { if (format_file == NULL) format_file = xstrdup((char *) name_of_file + 1); #ifdef COMPACTFORMAT gz_fmt_file = gzdopen(fileno(*f), "rb9"); #endif } else if (strstr((char *) name_of_file + 1, ".tfm") != NULL) { if (show_tfm_flag && log_opened) { int n; n = strlen((char *) name_of_file + 1); if (file_offset + n > max_print_line) { (void) putc('\n', log_file); file_offset = 0; } else (void) putc(' ', log_file); fprintf(log_file, "(%s)", name_of_file + 1); file_offset += n + 3; } } else if (source_direct == NULL) { char *s; source_direct = xstrdup((char *) name_of_file + 1); if (trace_flag) printf("Methinks the source %s is `%s'\n", "file", source_direct); if ((s = strrchr(source_direct, '/')) == NULL) *source_direct = '\0'; else *(s + 1) = '\0'; if (trace_flag) printf("Methinks the source %s is `%s'\n", "directory", source_direct); } openable = true; } { unsigned temp_length = strlen((char *) name_of_file + 1); name_of_file[temp_length + 1] = ' '; } return openable; }