FreeType 1.31.1

This commit is contained in:
2023-08-27 18:03:45 +02:00
commit 5edbb7a80a
454 changed files with 173977 additions and 0 deletions

602
contrib/ttf2pk/filesrch.c Normal file
View File

@@ -0,0 +1,602 @@
/*
* filesrch.c
*
* This file is part of the ttf2pk package.
*
* Copyright 1997-1999 by
* Frederic Loyer <loyer@ensta.fr>
* Werner Lemberg <wl@gnu.org>
*/
/*
* Interface to the system specific TeX file search routines.
*/
#include <stddef.h> /* for size_t */
#include <stdlib.h>
#include <string.h>
#include "filesrch.h"
#include "newobj.h"
/****************************
* kpathsea library support *
****************************/
#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
/* this is kpathsea 3.3 and newer */
extern KPSEDLL char *kpathsea_version_string;
#else
extern DllImport char *kpathsea_version_string;
#endif
/*
* Initialize kpathsea library; arguments are the full name of the
* executable (e.g. `/usr/bin/ttf2pk') and two identification strings;
* the former for the program itself (to have texmf.cnf constructs like
* `TFMFONTS.ttf2pk'), the latter for the environment (to have environment
* constructs like `TTF2PKMAKEPK').
*/
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)
{
/* no extra extension handling necessary */
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)
{
/* no extra extension handling necessary */
#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
/* test for .ttc, but only if no extension was given initially */
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 /* OLD_KPATHSEA */
/* no extra extension handling necessary */
return kpse_find_file(*name, kpse_truetype_format, True);
#endif
}
/****************************
* emtexdir library support *
****************************/
#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;
/*
* We slightly modify emtex_dir_setup() to output a warning in case
* the environment variable isn't set properly.
*/
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;
}
/*
* Initialize emtexdir library; arguments are the full name of the
* executable (e.g. `c:\bin\ttf2pk.exe') and two identification strings;
* the former for the program itself, the latter for the environment.
* We ignore all of them.
*/
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)
{
/* no extra extension handling necessary */
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);
/* test for .ttc, but only if no extension was given initially */
if (!real_name && l != strlen(*name))
{
(*name)[strlen(*name) - 1] = 'c';
real_name = file_find(*name, &ttf_path);
}
return real_name;
}
/**************************
* MiKTeX library support *
**************************/
#elif defined(MIKTEX)
#include "miktex.h"
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
/* empty */
}
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);
}
/**********************
* no library support *
**********************/
#else
#include <stdio.h>
char version_string[] = "no search library";
void
TeX_search_init(char *exec_name,
char *program_identifier,
char *env_identifier)
{
/* empty */
}
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)
{
/* no extra extension handling necessary */
return *name;
}
/* we only handle .ttf extension */
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);
}
/*
* This function takes the address of a pointer to a string allocated
* with malloc() and checks whether it has an extension. If not, a default
* extension given as a second argument will be appended using first
* realloc() and then strcat().
*
* '/', ':', and '\\' will be recognized as directory separators.
*/
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);
}
}
/* end */