#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "filesrch.h"
#include "newobj.h"
#if defined(HAVE_LIBKPATHSEA)
#ifdef VERY_OLD_KPATHSEA
#include "kpathsea/proginit.h"
#include "kpathsea/progname.h"
#include "kpathsea/tex-glyph.h"
#else
#include "kpathsea/kpathsea.h"
#endif
#ifdef KPSEDLL
extern KPSEDLL char *kpathsea_version_string;
#else
extern DllImport char *kpathsea_version_string;
#endif
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
#ifdef OLD_KPATHSEA
kpse_set_progname(exec_name);
#else
kpse_set_program_name(exec_name, program_identifier);
#endif
#ifdef VERY_OLD_KPATHSEA
kpse_init_prog(env_identifier, 300, "cx", true, "cmr10");
#else
kpse_init_prog(env_identifier, 300, "cx", "cmr10");
#endif
}
char *
TeX_search_version(void)
{
return kpathsea_version_string;
}
char *
TeX_search_tfm(char **name)
{
return kpse_find_file(*name, kpse_tfm_format, True);
}
char *
TeX_search_encoding_file(char **name)
{
handle_extension(name, ".enc");
#ifdef OLD_KPATHSEA
#ifdef VERY_OLD_KPATHSEA
return kpse_find_file(*name, kpse_dvips_header_format, True);
#else
return kpse_find_file(*name, kpse_tex_ps_header_format, True);
#endif
#else
return kpse_find_file(*name, kpse_program_text_format, True);
#endif
}
char *
TeX_search_replacement_file(char **name)
{
handle_extension(name, ".rpl");
#ifdef OLD_KPATHSEA
#ifdef VERY_OLD_KPATHSEA
return kpse_find_file(*name, kpse_dvips_header_format, True);
#else
return kpse_find_file(*name, kpse_tex_ps_header_format, True);
#endif
#else
return kpse_find_file(*name, kpse_program_text_format, True);
#endif
}
char *
TeX_search_sfd_file(char **name)
{
handle_extension(name, ".sfd");
#ifdef OLD_KPATHSEA
#ifdef VERY_OLD_KPATHSEA
return kpse_find_file(*name, kpse_dvips_header_format, True);
#else
return kpse_find_file(*name, kpse_tex_ps_header_format, True);
#endif
#else
return kpse_find_file(*name, kpse_program_text_format, True);
#endif
}
char *
TeX_search_config_file(char **name)
{
#ifdef OLD_KPATHSEA
return kpse_find_file(*name, kpse_dvips_config_format, True);
#else
return kpse_find_file(*name, kpse_program_text_format, True);
#endif
}
char *
TeX_search_ttf_file(char **name)
{
#ifdef OLD_KPATHSEA
size_t l;
char* real_name;
l = strlen(*name);
handle_extension(name, ".ttf");
#ifdef VERY_OLD_KPATHSEA
real_name = kpse_find_file(*name, kpse_dvips_header_format, True);
#else
real_name = kpse_find_file(*name, kpse_type1_format, True);
#endif
if (!real_name && l != strlen(*name))
{
(*name)[strlen(*name) - 1] = 'c';
#ifdef VERY_OLD_KPATHSEA
real_name = kpse_find_file(*name, kpse_dvips_header_format, True);
#else
real_name = kpse_find_file(*name, kpse_type1_format, True);
#endif
}
return real_name;
#else
return kpse_find_file(*name, kpse_truetype_format, True);
#endif
}
#elif defined(HAVE_EMTEXDIR)
#include "emtexdir.h"
#include "errormsg.h"
extern int setup_list(struct emtex_dir *dst, char *path,
const char *list, unsigned flags);
char emtex_version_string[] = "emTeXdir";
struct emtex_dir tfm_path,
enc_path,
rpl_path,
sfd_path,
cfg_path,
ttf_path;
static int
dir_setup(struct emtex_dir *ed,
const char *env,
const char *dir,
unsigned flags)
{
const char *val;
char path[260];
ed->alloc = 0;
ed->used = 0;
ed->list = NULL;
if (env != NULL && (val = getenv(env)) != NULL)
return setup_list(ed, path, val, flags);
else
warning("Environment variable %s not set; use current directory.", env);
return True;
}
static char *
file_find(char *name, struct emtex_dir *list)
{
char buffer[1024];
if (emtex_dir_find(buffer, sizeof (buffer), list, name, EDF_CWD))
return newstring(buffer);
return NULL;
}
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
if (!dir_setup(&tfm_path, "TEXTFM", NULL, EDS_BANG))
oops("Cannot setup search path for tfm files");
if (!dir_setup(&enc_path, "TTFCFG", NULL, EDS_BANG))
oops("Cannot setup search path for encoding files");
#if 0
if (!dir_setup(&rpl_path, "TTFCFG", NULL, EDS_BANG))
oops("Cannot setup search path for replacement files");
if (!dir_setup(&sfd_path, "TTFCFG", NULL, EDS_BANG))
oops("Cannot setup search path for subfont definition files");
if (!dir_setup(&cfg_path, "TTFCFG", NULL, EDS_BANG))
oops("Cannot setup search path for configuration file");
#else
rpl_path = sfd_path = cfg_path = enc_path;
#endif
if (!dir_setup(&ttf_path, "TTFONTS", NULL, EDS_BANG))
oops("Cannot setup search path for TrueType font files");
}
char *
TeX_search_version(void)
{
return emtex_version_string;
}
char *
TeX_search_tfm(char **name)
{
handle_extension(name, ".tfm");
return file_find(*name, &tfm_path);
}
char *
TeX_search_encoding_file(char **name)
{
handle_extension(name, ".enc");
return file_find(*name, &enc_path);
}
char *
TeX_search_replacement_file(char **name)
{
handle_extension(name, ".rpl");
return file_find(*name, &rpl_path);
}
char *
TeX_search_sfd_file(char **name)
{
handle_extension(name, ".sfd");
return file_find(*name, &sfd_path);
}
char *
TeX_search_config_file(char **name)
{
return file_find(*name, &cfg_path);
}
char *
TeX_search_ttf_file(char **name)
{
size_t l;
char* real_name;
l = strlen(*name);
handle_extension(name, ".ttf");
real_name = file_find(*name, &ttf_path);
if (!real_name && l != strlen(*name))
{
(*name)[strlen(*name) - 1] = 'c';
real_name = file_find(*name, &ttf_path);
}
return real_name;
}
#elif defined(MIKTEX)
#include "miktex.h"
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
}
char *
TeX_search_version(void)
{
char buf[200];
strcpy(buf, "MiKTeX ");
miktex_get_miktex_version_string_ex(buf + 7, sizeof (buf) - 7);
return buf;
}
char *
TeX_search_tfm(char **name)
{
char result[_MAX_PATH];
if (!miktex_find_tfm_file(*name, result))
return 0;
return strdup(result);
}
char *
TeX_search_encoding_file(char **name)
{
char result[_MAX_PATH];
if (!miktex_find_enc_file(*name, result))
return 0;
return strdup(result);
}
char *
TeX_search_replacement_file(char **name)
{
char result[_MAX_PATH];
handle_extension(name, ".rpl");
if (!miktex_find_input_file("ttf2tfm", *name, result))
return 0;
return strdup(result);
}
char *
TeX_search_sfd_file(char **name)
{
char result[_MAX_PATH];
handle_extension(name, ".sfd");
if (!miktex_find_input_file("ttf2tfm", *name, result))
return 0;
return strdup(result);
}
char *
TeX_search_config_file(char **name)
{
char result[_MAX_PATH];
if (!miktex_find_input_file("ttf2tfm", *name, result))
return 0;
return strdup(result);
}
char *
TeX_search_ttf_file(char **name)
{
char result[_MAX_PATH];
if (!miktex_find_ttf_file(*name, result))
return 0;
return strdup(result);
}
#else
#include <stdio.h>
char version_string[] = "no search library";
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
}
char *
TeX_search_version(void)
{
return version_string;
}
char *
TeX_search_tfm(char **name)
{
handle_extension(name, ".tfm");
return *name;
}
char *
TeX_search_encoding_file(char **name)
{
handle_extension(name, ".enc");
return *name;
}
char *
TeX_search_replacement_file(char **name)
{
handle_extension(name, ".rpl");
return *name;
}
char *
TeX_search_sfd_file(char **name)
{
handle_extension(name, ".sfd");
return *name;
}
char *
TeX_search_config_file(char **name)
{
return *name;
}
char *
TeX_search_ttf_file(char **name)
{
handle_extension(name, ".ttf");
return *name;
}
#endif
void
get_tfm_fullname(Font *fnt)
{
size_t len = 0;
if (fnt->fullname)
free(fnt->fullname);
if (fnt->outname)
len += strlen(fnt->outname);
if (fnt->subfont_name)
len += strlen(fnt->subfont_name);
if (fnt->outname_postfix)
len += strlen(fnt->outname_postfix);
len++;
fnt->fullname = (char *)mymalloc(len);
fnt->fullname[0] = '\0';
if (fnt->outname)
strcat(fnt->fullname, fnt->outname);
if (fnt->subfont_name)
strcat(fnt->fullname, fnt->subfont_name);
if (fnt->outname_postfix)
strcat(fnt->fullname, fnt->outname_postfix);
}
void
handle_extension(char **stringp,
char *extension)
{
int i, lastext = -1;
for (i = 0; (*stringp)[i]; i++)
if ((*stringp)[i] == '.')
lastext = i;
else if ((*stringp)[i] == '/' ||
(*stringp)[i] == ':' ||
(*stringp)[i] == '\\')
lastext = -1;
if (lastext == -1)
{
*stringp = (char *)myrealloc((void *)*stringp,
strlen(*stringp) + strlen(extension) + 1);
strcat(*stringp, extension);
}
}