home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
unixtex-6.1b-src.tgz
/
tar.out
/
contrib
/
unixtex
/
web2c
/
lib
/
openinout.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-28
|
6KB
|
246 lines
/* openinout.c: open input and output files. These routines used by
TeX, Metafont, and BibTeX. */
#include "config.h"
#include <kpathsea/c-namemx.h>
#include <kpathsea/c-pathch.h>
#include <kpathsea/tex-make.h>
#ifdef BibTeX
/* See comments in bibtex.ch for why we need these. */
FILE *standardinput /* = stdin */;
FILE *standardoutput /* = stdout */;
/* Because we don't generate a .h file with all the global definitions
for BibTeX, as we do with TeX and Metafont, we must declare these
variables. */
extern char nameoffile[];
extern integer namelength;
#else /* not BibTeX */
#define EXTERN extern /* Don't instantiate data here. */
#ifdef TeX
#include "texd.h"
#else /* Metafont */
#include "mfd.h"
#endif
#ifdef FUNNY_CORE_DUMP
/* This is defined in texmf.c. */
extern void funny_core_dump ();
#endif /* FUNNY_CORE_DUMP */
#endif /* not BibTeX */
/* Open an input file F, using the path PATHSPEC and passing
FOPEN_MODE to fopen. The filename is in `nameoffile', as a Pascal
string. We return whether or not the open succeeded. If it did, we
also set `namelength' to the length of the full pathname that we
opened. */
boolean
open_input (f, path_index, fopen_mode)
FILE **f;
path_constant_type path_index;
char *fopen_mode;
{
boolean openable = false;
#if defined (FUNNY_CORE_DUMP) && !defined (BibTeX)
/* This only applies if a preloaded TeX/Metafont is being made;
it allows automatic creation of the core dump (typing ^\ loses
since it requires manual intervention). */
if ((path_index == TEXINPUTPATH || path_index == MFINPUTPATH)
&& strncmp (nameoffile+1, "HackyInputFileNameForCoreDump.tex", 33) == 0)
funny_core_dump ();
#endif /* FUNNY_CORE_DUMP and not BibTeX */
#ifdef BibTeX
if (path_index == NO_FILE_PATH)
{
unsigned temp_length;
null_terminate (nameoffile + 1);
*f = fopen (nameoffile + 1, fopen_mode);
temp_length = strlen (nameoffile + 1);
space_terminate (nameoffile + 1);
if (*f != NULL)
{
namelength = temp_length;
openable = true;
}
}
else
#endif /* BibTeX */
if (testreadaccess (nameoffile, path_index))
{
/* We can assume `nameoffile' is openable, since
`testreadaccess' just returned true. */
*f = xfopen_pas (nameoffile, fopen_mode);
/* If we found the file in the current directory, don't leave the
`./' at the beginning of `nameoffile', since it looks dumb when
TeX says `(./foo.tex ... )', and analogously for Metafont. */
if (nameoffile[1] == '.' && IS_DIR_SEP (nameoffile[2]))
{
unsigned i = 1;
while (nameoffile[i + 2] != ' ')
{
nameoffile[i] = nameoffile[i + 2];
i++;
}
nameoffile[i] = ' ';
namelength = i - 1;
}
else
namelength = strchr (nameoffile + 1, ' ') - nameoffile - 1;
#ifdef TeX
/* If we just opened a TFM file, we have to read the first byte,
since TeX wants to look at it. What a kludge. */
if (path_index == TFMFILEPATH)
{ /* See comments in ctex.ch for why we need this. */
extern integer tfmtemp;
tfmtemp = getc (*f);
}
#endif /* TeX */
openable = true;
}
return openable;
}
/* Call the external program for FORMAT, passing it `nameoffile'. We'd
like to pass back the filename the script returns, but I'm not yet
sure how to do that in Pascal. */
static boolean
make_tex_file (format)
kpse_file_format_type format;
{
static boolean kpathsea_dpi_set = 0;
static boolean maketex_base_dpi_set = 0;
string found;
/* Since & is a no-op when applied to an array, we must put the
address of the filename in a variable. */
string name = nameoffile;
if (!kpathsea_dpi_set)
{
if (!getenv ("KPATHSEA_DPI"))
xputenv_int ("KPATHSEA_DPI", 300);
kpathsea_dpi_set = 1;
}
if (!maketex_base_dpi_set)
{
if (!getenv ("MAKETEX_BASE_DPI"))
xputenv_int ("MAKETEX_BASE_DPI", 300);
maketex_base_dpi_set = 1;
}
make_c_string (&name);
found = kpse_make_tex (format, name);
make_pascal_string (&name);
return found != NULL;
}
/* These are called by TeX or MF if an input or TFM file can't be opened. */
boolean
maketextex ()
{
return make_tex_file (kpse_tex_format);
}
boolean
maketexmf ()
{
return make_tex_file (kpse_mf_format);
}
boolean
maketextfm ()
{
return make_tex_file (kpse_tfm_format);
}
/* Open an output file F either in the current directory or in
$TEXMFOUTPUT/F, if the environment variable `TEXMFOUTPUT' exists.
(Actually, this applies to the BibTeX output files, also, but
`TEXMFBIBOUTPUT' was just too long.) The filename is in the global
`nameoffile', as a Pascal string. We return whether or not the open
succeeded. If it did, the global `namelength' is set to the length
of the actual filename. */
boolean
open_output (f, fopen_mode)
FILE **f;
char *fopen_mode;
{
unsigned temp_length;
/* Make the filename into a C string. */
null_terminate (nameoffile + 1);
/* Is the filename openable as given? */
*f = fopen (nameoffile + 1, fopen_mode);
if (*f == NULL)
{ /* Can't open as given. Try the envvar. */
string temp_dir = getenv ("TEXMFOUTPUT");
if (temp_dir != NULL)
{
string temp_name = concat3 (temp_dir, "/", nameoffile + 1);
*f = fopen (temp_name, fopen_mode);
/* If this succeeded, change nameoffile accordingly. */
if (*f)
strcpy (nameoffile + 1, temp_name);
free (temp_name);
}
}
/* Back into a Pascal string, but first get its length. */
temp_length = strlen (nameoffile + 1);
space_terminate (nameoffile + 1);
/* Only set `namelength' if we succeeded. I'm not sure why. */
if (*f)
namelength = temp_length;
return *f != NULL;
}
/* Test if the Pascal string BASE concatenated with the extension
`.SUFFIX' is the same file as just BASE. SUFFIX is a C string. */
boolean
extensionirrelevantp (base, suffix)
char *base;
char *suffix;
{
boolean ret;
char temp[PATH_MAX];
make_c_string (&base);
strcpy (temp, base);
strcat (temp, ".");
strcat (temp, suffix);
ret = same_file_p (base, temp);
make_pascal_string (&base);
return ret;
}