home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
unixtex-6.1b-src.tgz
/
tar.out
/
contrib
/
unixtex
/
dvipsk
/
search.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-28
|
4KB
|
188 lines
/*
* The search routine takes a directory list, separated by PATHSEP, and
* tries to open a file. Null directory components indicate current
* directory. In an environment variable, null directory components
* indicate substitution of the default path list at that point.
*/
#include "dvips.h" /* The copyright notice in that file is included too! */
#include <kpathsea/tex-file.h>
#include <kpathsea/tex-glyph.h>
extern char name[];
/*
*
* We hope MAXPATHLEN is enough -- only rudimentary checking is done!
*/
#ifdef SECURE
extern Boolean secure;
#endif
#ifdef DEBUG
extern integer debug_flag;
#endif /* DEBUG */
extern char *mfmode ;
extern int actualdpi ;
string realnameoffile ;
FILE *
search(format, file, mode)
kpse_file_format_type format;
char *file, *mode ;
{
FILE *ret;
string found_name;
#ifdef SECURE
/* This change suggested by maj@cl.cam.ac.uk to disallow reading of
arbitrary files. */
if (secure && kpse_absolute_p (file)) return NULL;
#endif
/* Most file looked for through here must exist -- the exception is
VF's. Bitmap fonts go through pksearch. */
found_name = kpse_find_file (file, format, format != vfpath);
if (found_name)
{
strcpy (name, found_name);
ret = fopen (name, mode);
if (!ret)
FATAL_PERROR (name);
realnameoffile = name;
}
else
ret = NULL;
return ret;
} /* end search */
FILE *
pksearch(path, file, mode, dpi, name_ret, dpi_ret)
char *path, *file, *mode ;
char **name_ret ;
halfword dpi;
int *dpi_ret ;
{
FILE *ret;
kpse_glyph_file_type font_file;
string found_name = kpse_find_pk (file, dpi, &font_file);
if (found_name)
{
strcpy (name, found_name);
ret = fopen (name, mode);
if (!ret)
FATAL_PERROR (name);
realnameoffile = name;
*name_ret = font_file.name;
*dpi_ret = font_file.dpi;
}
else
ret = NULL;
return ret;
} /* end search */
/* do we report file openings? */
#ifdef DEBUG
# ifdef fopen
# undef fopen
# endif
# ifdef VMCMS /* IBM: VM/CMS */
# define fopen cmsfopen
# endif /* IBM: VM/CMS */
FILE *my_real_fopen(n, t)
register char *n, *t ;
{
FILE *tf ;
if (dd(D_FILES)) {
fprintf(stderr, "<%s(%s)> ", n, t) ;
tf = fopen(n, t) ;
if (tf == 0)
fprintf(stderr, "failed\n") ;
else
fprintf(stderr, "succeeded\n") ;
} else
tf = fopen(n, t) ;
#ifdef OS2
if (tf == (FILE *)NULL)
tf = fat_fopen(n, t); /* try again with filename truncated to 8.3 */
#endif
return tf ;
}
#endif
#ifdef OS2
/* truncate filename at end of fname to FAT filesystem 8.3 limit */
/* if truncated, return fopen() with new name */
FILE *fat_fopen(fname, t)
char *fname, *t;
{
char *np; /* pointer to name within path */
char nbuf[13], *ns, *nd;
char n[MAXPATHLEN];
int ni, ne;
FILE *tf;
strcpy(n, fname);
for (ns=n; *ns; ns++) {
if (*ns=='/')
*ns=DIRSEP;
}
np = strrchr(n,DIRSEP);
if (np==(char *)NULL)
np = n;
else
np++;
/* fail if it contains more than one '.' */
ni = 0;
for (ns=np; *ns; ns++) {
if (*ns=='.')
ni++;
}
if (ni>1)
return (FILE *)NULL;
/* copy it to nbuf, truncating to 8.3 */
ns = np;
nd = nbuf;
ni = 0;
while ((*ns!='.') && (*ns) && (ni<8)) {
*nd++ = *ns++;
ni++;
}
while ((*ns!='.') && (*ns)) {
ns++;
ni++;
}
ne = 0;
if (*ns=='.') {
*nd++ = *ns++;
while ((*ns!='.') && (*ns) && (ne<3)) {
*nd++ = *ns++;
ne++;
}
while (*ns) {
ns++;
ne++;
}
}
*nd++='\0';
if ((ni>8) || (ne>3)) {
strcpy(np,nbuf);
/* now code copied from my_real_fopen() */
if (dd(D_FILES)) {
fprintf(stderr, "<%s(%s)> ", n, t) ;
tf = fopen(n, t) ;
if (tf == 0)
fprintf(stderr, "failed\n") ;
else
fprintf(stderr, "succeeded\n") ;
}
else
tf = fopen(n, t) ;
return tf;
}
return (FILE *)NULL;
}
#endif