summaryrefslogtreecommitdiff
path: root/Build/source/texk/kpathsea/kpsewhich.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/kpathsea/kpsewhich.c')
-rw-r--r--Build/source/texk/kpathsea/kpsewhich.c941
1 files changed, 0 insertions, 941 deletions
diff --git a/Build/source/texk/kpathsea/kpsewhich.c b/Build/source/texk/kpathsea/kpsewhich.c
deleted file mode 100644
index 76f956a2480..00000000000
--- a/Build/source/texk/kpathsea/kpsewhich.c
+++ /dev/null
@@ -1,941 +0,0 @@
-/* kpsewhich -- standalone path lookup and variable expansion for Kpathsea.
- Ideas from Thomas Esser, Pierre MacKay, and many others.
-
- Copyright 1995-2021 Karl Berry & Olaf Weber.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this library; if not, see <http://www.gnu.org/licenses/>. */
-
-#include <kpathsea/config.h>
-#include <kpathsea/c-ctype.h>
-#include <kpathsea/c-pathch.h>
-#include <kpathsea/cnf.h>
-#include <kpathsea/expand.h>
-#include <kpathsea/getopt.h>
-#include <kpathsea/line.h>
-#include <kpathsea/pathsearch.h>
-#include <kpathsea/proginit.h>
-#include <kpathsea/str-list.h>
-#include <kpathsea/tex-file.h>
-#include <kpathsea/tex-glyph.h>
-#include <kpathsea/variable.h>
-#include <kpathsea/version.h>
-
-/* For variable and path expansion. (-expand-var, -expand-path,
- -show-path, etc.) */
-string var_to_expand = NULL;
-string braces_to_expand = NULL;
-string path_to_expand = NULL;
-string path_to_show = NULL;
-string var_to_value = NULL;
-string var_to_brace_value = NULL;
-
-/* Array/count of cnf lines from the command line. (--cnf-line) */
-static string *user_cnf_lines = NULL;
-static unsigned user_cnf_nlines = 0;
-
-/* Base resolution. (-D, -dpi) */
-unsigned dpi = 600;
-
-/* The engine name, for `$engine' construct in texmf.cnf. (-engine) */
-string engine = NULL;
-
-/* Interactively ask for names to look up? (-interactive) */
-boolean interactive = false;
-
-/* The device name, for $MAKETEX_MODE. (-mode) */
-string mode = NULL;
-
-/* Search the disk as well as ls-R? (-must-exist, -mktex) */
-boolean must_exist = false;
-
-/* The program name, for `.PROG' construct in texmf.cnf. (-program) */
-string progname = NULL;
-
-/* Safe input and output names to check. (-safe-in-name and -safe-out-name) */
-string safe_in_name = NULL;
-string safe_out_name = NULL;
-
-/* Return all matches, not just the first one? (-all) */
-boolean show_all = false;
-
-/* Only match files in given subdirs. (-subdir) */
-str_list_type subdir_paths;
-
-/* The file type and path for lookups. (-format, -path) */
-kpse_file_format_type user_format = kpse_last_format;
-string user_format_string;
-string user_path;
-
-
-
-/* Define one-word abbreviations for those format types which
- can otherwise only be specified by strings containing spaces. */
-
-typedef struct
-{
- const_string abbr;
- kpse_file_format_type format;
-} format_abbr_type;
-
-static format_abbr_type format_abbrs[]
- = { { "bitmapfont", kpse_any_glyph_format },
- { "mpsupport", kpse_mpsupport_format },
- { "doc", kpse_texdoc_format },
- { "source", kpse_texsource_format },
- { "trofffont", kpse_troff_font_format },
- { "dvipsconfig", kpse_dvips_config_format },
- { "web2c", kpse_web2c_format },
- { "othertext", kpse_program_text_format },
- { "otherbin", kpse_program_binary_format },
- { "miscfont", kpse_miscfonts_format },
- { "cmap", kpse_cmap_format },
- { "pdftexconfig", kpse_pdftex_config_format },
- { NULL, kpse_last_format } };
-
-/* The function to look up STR in the abbr table above.
- This is called only on a user-specified format string.
- Return `kpse_last_format' if no match. */
-
-static kpse_file_format_type
-format_abbr (const_string str)
-{
- kpse_file_format_type ret = kpse_last_format;
- unsigned a = 0;
-
- while (format_abbrs[a].abbr != NULL) {
- if (STREQ (str, format_abbrs[a].abbr)) {
- ret = format_abbrs[a].format;
- break;
- }
- a++;
- }
-
- return ret;
-}
-
-
-
-/* Return the <number> substring in `<name>.<number><stuff>', if S has
- that form. If it doesn't, return 0. */
-
-static unsigned
-find_dpi (string s)
-{
- unsigned dpi_number = 0;
- const_string extension = find_suffix (s);
-
- if (extension != NULL)
- sscanf (extension, "%u", &dpi_number);
-
- return dpi_number;
-}
-
-
-
-/* Return true if FTRY (the candidate suffix) matches NAME. If
- IS_FILENAME is true, the check is simply that FTRY is a suffix of
- NAME. If false (that is, NAME is a format), then FTRY and NAME must
- be entirely equal. */
-
-static boolean
-try_suffix (boolean is_filename, string name, unsigned name_len,
- const_string ftry)
-{
- unsigned try_len;
-
- if (!ftry || ! *ftry) {
- return false;
- }
-
- try_len = strlen (ftry);
- if (try_len > name_len) {
- /* Candidate is longer than what we're looking for. */
- return false;
- }
- if (!is_filename && try_len < name_len) {
- /* We're doing format names, not file names, and candidate is
- shorter than what we're looking for. E.g., do not find `lua'
- when looking for `clua'. */
- return false;
- }
-
- if (FILESTRCASEEQ (name + name_len - try_len, ftry)) {
- return true;
- }
-
- return false;
-}
-
-
-
-/* Use the file type from -format if that was previously determined
- (i.e., the user_format global variable), else guess dynamically from
- NAME. Return kpse_last_format if undeterminable. This function is
- also used to parse the -format string, a case we distinguish via
- is_filename being false.
-
- A few filenames have been hard-coded for format types that
- differ from what would be inferred from their extensions. */
-
-static kpse_file_format_type
-find_format (kpathsea kpse, string name, boolean is_filename)
-{
- kpse_file_format_type ret = kpse_last_format;
-
- if (is_filename && user_format != kpse_last_format) {
- ret = user_format; /* just return what we already computed */
-
- } else if (FILESTRCASEEQ (name, "config.ps")) {
- ret = kpse_dvips_config_format;
- } else if (FILESTRCASEEQ (name, "fmtutil.cnf")) {
- ret = kpse_web2c_format;
- } else if (FILESTRCASEEQ (name, "glyphlist.txt")) {
- ret = kpse_fontmap_format;
- } else if (FILESTRCASEEQ (name, "mktex.cnf")) {
- ret = kpse_web2c_format;
- } else if (FILESTRCASEEQ (name, "pdfglyphlist.txt")) {
- ret = kpse_fontmap_format;
- } else if (FILESTRCASEEQ (name, "pdftex.cfg")) {
- ret = kpse_pdftex_config_format;
- } else if (FILESTRCASEEQ (name, "texglyphlist.txt")) {
- ret = kpse_fontmap_format;
- } else if (FILESTRCASEEQ (name, "texmf.cnf")) {
- ret = kpse_cnf_format;
- } else if (FILESTRCASEEQ (name, "updmap.cfg")) {
- ret = kpse_web2c_format;
- } else if (FILESTRCASEEQ (name, "XDvi")) {
- ret = kpse_program_text_format;
- } else {
- if (!is_filename) {
- /* Look for kpsewhich-specific format abbreviations. */
- ret = format_abbr (name);
- }
-
- if (ret == kpse_last_format) {
- int f = 0; /* kpse_file_format_type */
- unsigned name_len = strlen (name);
-
- while (f != kpse_last_format) {
- const_string *ext;
- const_string ftry;
- boolean found = false;
-
- if (!kpse->format_info[f].type)
- kpathsea_init_format (kpse, (kpse_file_format_type) f);
-
-/* Just to abbreviate this lengthy call. */
-#define TRY_SUFFIX(ftry) try_suffix (is_filename, name, name_len, (ftry))
-
- if (!is_filename) {
- /* Allow the long name, but only in the format options. We don't
- want a filename confused with a format name. */
- ftry = kpse->format_info[f].type;
- found = TRY_SUFFIX (ftry);
- }
- for (ext = kpse->format_info[f].suffix; !found && ext && *ext; ext++) {
- found = TRY_SUFFIX (*ext);
- }
- for (ext=kpse->format_info[f].alt_suffix; !found && ext && *ext;ext++){
- found = TRY_SUFFIX (*ext);
- }
-
- if (found)
- break;
- f++;
- }
- ret = f;
- }
- }
- return ret;
-}
-
-
-
-/* Return newly-allocated NULL-terminated list of strings from MATCHES
- that are prefixed with any of the subdirectories in SUBDIRS. That
- is, for a string S in MATCHES, its dirname must end with one of the
- elements in SUBDIRS. For instance, if subdir=foo/bar, that will
- match a string foo/bar/baz or /some/texmf/foo/bar/baz.
-
- We don't reallocate the actual strings, just the list elements.
- Perhaps later we will implement wildcards or // or something. */
-
-#if defined(WIN32)
-static string *
-kpathsea_subdir_match (kpathsea kpse, str_list_type subdirs, string *matches)
-{
- string *ret = XTALLOC1 (string);
- unsigned len = 1;
- unsigned e;
- unsigned m;
- string p;
-
- for (e = 0; e < STR_LIST_LENGTH (subdirs); e++) {
- for (p = STR_LIST_ELT (subdirs, e); *p; p++) {
- if (*p == '\\')
- *p = '/';
- else if (kpathsea_IS_KANJI(kpse, p))
- p++;
- }
- }
-
- for (m = 0; matches[m]; m++) {
- unsigned loc;
- string s = xstrdup (matches[m]);
- for (loc = strlen (s); loc > 0 && !IS_DIR_SEP_CH (s[loc-1]); loc--)
- ;
- while (loc > 0 && IS_DIR_SEP_CH (s[loc-1])) {
- loc--;
- }
- s[loc] = 0; /* wipe out basename */
-
- for (e = 0; e < STR_LIST_LENGTH (subdirs); e++) {
- string subdir = STR_LIST_ELT (subdirs, e);
- unsigned subdir_len = strlen (subdir);
- while (subdir_len > 0 && IS_DIR_SEP_CH (subdir[subdir_len-1])) {
- subdir_len--;
- subdir[subdir_len] = 0; /* remove trailing slashes from subdir spec */
- }
- if (FILESTRCASEEQ (subdir, s + loc - subdir_len)) {
- /* matched, save this one. */
- XRETALLOC (ret, len + 1, string);
- ret[len-1] = matches[m];
- len++;
- }
- }
- free (s);
- }
- ret[len-1] = NULL;
- return ret;
-}
-
-#else /* WIN32 */
-static string *
-subdir_match (str_list_type subdirs, string *matches)
-{
- string *ret = XTALLOC1 (string);
- unsigned len = 1;
- unsigned e;
- unsigned m;
-
- for (m = 0; matches[m]; m++) {
- unsigned loc;
- string s = xstrdup (matches[m]);
- for (loc = strlen (s); loc > 0 && !IS_DIR_SEP_CH (s[loc-1]); loc--)
- ;
- while (loc > 0 && IS_DIR_SEP_CH (s[loc-1])) {
- loc--;
- }
- s[loc] = 0; /* wipe out basename */
-
- for (e = 0; e < STR_LIST_LENGTH (subdirs); e++) {
- string subdir = STR_LIST_ELT (subdirs, e);
- unsigned subdir_len = strlen (subdir);
- while (subdir_len > 0 && IS_DIR_SEP_CH (subdir[subdir_len-1])) {
- subdir_len--;
- subdir[subdir_len] = 0; /* remove trailing slashes from subdir spec */
- }
- if (FILESTRCASEEQ (subdir, s + loc - subdir_len)) {
- /* matched, save this one. */
- XRETALLOC (ret, len + 1, string);
- ret[len-1] = matches[m];
- len++;
- }
- }
- free (s);
- }
- ret[len-1] = NULL;
- return ret;
-}
-#endif /* WIN32 */
-
-
-/* Look up a single filename NAME, filtering by given subdirectories if
- -subdir was specified. Print all matches if global `show_all' is
- true, else just the first match. Return 0 if success, 1 if failure. */
-
-static unsigned
-lookup (kpathsea kpse, string name)
-{
- int i;
- string ret = NULL;
- string *ret_list = NULL;
-
- if (user_path) {
- /* Translate ; to : if that's our ENV_SEP. See cnf.c. */
- if (IS_ENV_SEP (':')) {
- string loc;
- for (loc = user_path; *loc; loc++) {
- if (*loc == ';')
- *loc = ':';
- }
- }
- user_path = kpathsea_path_expand (kpse, user_path);
- if (show_all) {
- ret_list = kpathsea_all_path_search (kpse, user_path, name);
- } else {
- ret = kpathsea_path_search (kpse, user_path, name, must_exist);
- }
-
- } else {
- /* No user-specified search path, check user format or guess from NAME. */
- kpse_file_format_type fmt = find_format (kpse, name, true);
-
- switch (fmt) {
- case kpse_pk_format:
- case kpse_gf_format:
- case kpse_any_glyph_format:
- {
- kpse_glyph_file_type glyph_ret;
- string temp = remove_suffix (name);
- /* Try to extract the resolution from the name. */
- unsigned local_dpi = find_dpi (name);
- if (!local_dpi)
- local_dpi = dpi;
- if (show_all) {
- /* Because the whole glyph lookup thing is too complicated
- to try all the alternatives (cmr10.600pk vs.
- dpi600/cmr10.pk, just for starters). Patches welcome :). */
- WARNING1 ("kpsewhich: Ignoring --all for bitmap font, sorry: %s",
- name);
- }
- ret = kpathsea_find_glyph (kpse, temp,
- local_dpi, fmt, &glyph_ret);
- if (temp != name)
- free (temp);
- }
- break;
-
- case kpse_last_format:
- /* If the suffix isn't recognized, assume it's a tex file. */
- fmt = kpse_tex_format;
- /* fall through */
-
- default:
- if (show_all) {
- ret_list = kpathsea_find_file_generic (kpse, name, fmt,
- must_exist, true);
- } else {
- ret = kpathsea_find_file (kpse, name, fmt, must_exist);
- }
- }
- }
-
- /* Turn single return into a null-terminated list for uniform treatment. */
- if (ret) {
- ret_list = XTALLOC (2, string);
- ret_list[0] = ret;
- ret_list[1] = NULL;
- }
-
- /* Filter by subdirectories, if specified. */
- if (!STR_LIST_EMPTY (subdir_paths)) {
-#if defined(WIN32)
- string *new_list = kpathsea_subdir_match (kpse, subdir_paths, ret_list);
-#else
- string *new_list = subdir_match (subdir_paths, ret_list);
-#endif /* WIN32 */
- free (ret_list);
- ret_list = new_list;
- }
-
- /* Print output. */
- if (ret_list) {
- for (i = 0; ret_list[i]; i++)
-#ifdef WIN32
- kpathsea_win32_puts (kpse, ret_list[i]);
-#else
- puts (ret_list[i]);
-#endif
- /* Save whether we found anything */
- ret = ret_list[0];
- free (ret_list);
- }
-
- return ret == NULL;
-}
-
-/* Help message. */
-
-#define USAGE "\n\
-Standalone path lookup and expansion for the Kpathsea library.\n\
-The default is to look up each FILENAME in turn and report its\n\
-first match (if any) to standard output.\n\
-\n\
-When looking up format (.fmt/.base/.mem) files, it is usually necessary\n\
-to also use -engine, or nothing will be returned; in particular,\n\
--engine=/ will return matching format files for any engine.\n\
-\n\
--all output all matches, one per line (no effect with pk/gf).\n\
-[-no]-casefold-search fall back to case-insensitive search if no exact match.\n\
--cnf-line=STRING parse STRING as a configuration file line.\n\
--debug=NUM set debugging flags.\n\
--D, -dpi=NUM use a base resolution of NUM; default 600.\n\
--engine=STRING set engine name to STRING.\n\
--expand-braces=STRING output variable and brace expansion of STRING.\n\
--expand-path=STRING output complete path expansion of STRING.\n\
--expand-var=STRING output variable expansion of STRING.\n\
--format=NAME use file type NAME (list shown by -help-formats).\n\
--help display this message and exit.\n\
--help-formats display information about all supported file formats.\n\
--interactive ask for additional filenames to look up.\n\
-[-no]-mktex=FMT disable/enable mktexFMT generation (FMT=pk/mf/tex/tfm).\n\
--mode=STRING set device name for $MAKETEX_MODE to STRING; no default.\n\
--must-exist search the disk as well as ls-R if necessary.\n\
--path=STRING search in the path STRING.\n\
--progname=STRING set program name to STRING.\n\
--safe-in-name=STRING check if STRING is ok to open for input.\n\
--safe-out-name=STRING check if STRING is ok to open for output.\n\
--show-path=TYPE output search path for file type TYPE\n\
- (list shown by -help-formats).\n\
--subdir=STRING only output matches whose directory ends with STRING.\n\
--var-brace-value=STRING output brace-expanded value of variable $STRING.\n\
--var-value=STRING output variable-expanded value of variable $STRING.\n\
--version display version information number and exit.\n \
-"
-
-static void
-help_message (kpathsea kpse, string *argv)
-{
- printf ("Usage: %s [OPTION]... [FILENAME]...\n", argv[0]);
- fputs (USAGE, stdout);
- putchar ('\n');
- fputs (kpathsea_bug_address, stdout);
- fputs ("Kpathsea home page: https://tug.org/kpathsea/\n", stdout);
- exit (0);
-}
-
-static void
-help_formats (kpathsea kpse, string *argv)
-{
- int f; /* kpse_file_format_type */
-
- /* Have to set this for init_format to work. */
- kpathsea_set_program_name (kpse, argv[0], progname);
-
- puts (kpathsea_version_string);
- puts ("\nRecognized Kpathsea format names and their (abbreviations) and suffixes:");
- for (f = 0; f < kpse_last_format; f++) {
- const_string *ext;
-
- const_string envvar_list =
- kpathsea_init_format_return_varlist (kpse, (kpse_file_format_type) f);
- printf ("%s", kpse->format_info[f].type);
-
- /* Show abbreviation if we accept one. We repeatedly go through the
- abbr list here, but it's so short, it doesn't matter. */
- {
- unsigned a = 0;
- while (format_abbrs[a].abbr != NULL) {
- if (f == format_abbrs[a].format) {
- printf (" (%s)", format_abbrs[a].abbr);
- break;
- }
- a++;
- }
- }
-
- /* Regular suffixes. */
- putchar (':');
- for (ext = kpse->format_info[f].suffix; ext && *ext; ext++) {
- putchar (' ');
-#ifdef WIN32
- kpathsea_win32_fputs (kpse, *ext, stdout);
-#else
- fputs (*ext, stdout);
-#endif
- }
-
- if (kpse->format_info[f].alt_suffix) {
- /* leave extra space between default and alt suffixes */
- putchar (' ');
- }
- for (ext = kpse->format_info[f].alt_suffix; ext && *ext; ext++) {
- putchar (' ');
-#ifdef WIN32
- kpathsea_win32_fputs (kpse, *ext, stdout);
-#else
- fputs (*ext, stdout);
-#endif
- }
-
- printf (" [variables: %s]\n", envvar_list);
-
- printf (" [original path (from %s) = %s]\n",
- kpse->format_info[f].path_source, kpse->format_info[f].raw_path);
- }
-
- fputs ("\nTo see paths after expansion, use --show-path=FMT.\n\n", stdout);
- fputs (kpathsea_bug_address, stdout);
- exit (0);
-}
-
-
-/* Reading the options. */
-
-/* This macro tests whether getopt found an option ``A''.
- Assumes the option index is in the variable `option_index', and the
- option table in a variable `long_options'. */
-#define ARGUMENT_IS(a) STREQ (long_options[option_index].name, a)
-
-/* If S is NULL or the empty string, abort. */
-#define ENSURE_NONEMPTY_STRING(s) do { \
- if (!(s) || ! *(s)) { \
- fprintf (stderr, "kpsewhich: empty argument for %s\n", \
- long_options[option_index].name); \
- fputs ("Try `kpsewhich --help' for more information.\n", stderr); \
- exit (EXIT_FAILURE); } } while (0)
-
-/* SunOS cc can't initialize automatic structs. */
-static struct option long_options[]
- = { { "D", 1, 0, 0 },
- { "all", 0, (int *) &show_all, 1 },
- { "casefold-search", 0, 0, 0 },
- { "cnf-line", 1, 0, 0 },
- { "debug", 1, 0, 0 },
- { "dpi", 1, 0, 0 },
- { "engine", 1, 0, 0 },
- { "expand-braces", 1, 0, 0 },
- { "expand-path", 1, 0, 0 },
- { "expand-var", 1, 0, 0 },
- { "format", 1, 0, 0 },
- { "help", 0, 0, 0 },
- { "help-formats", 0, 0, 0 },
- { "interactive", 0, (int *) &interactive, 1 },
- { "mktex", 1, 0, 0 },
- { "mode", 1, 0, 0 },
- { "must-exist", 0, (int *) &must_exist, 1 },
- { "path", 1, 0, 0 },
- { "no-casefold-search", 0, 0, 0 },
- { "no-mktex", 1, 0, 0 },
- { "progname", 1, 0, 0 },
- { "safe-in-name", 1, 0, 0 },
- { "safe-out-name", 1, 0, 0 },
- { "subdir", 1, 0, 0 },
- { "show-path", 1, 0, 0 },
- { "var-brace-value", 1, 0, 0 },
- { "var-value", 1, 0, 0 },
- { "version", 0, 0, 0 },
- { 0, 0, 0, 0 } };
-
-static void
-read_command_line (kpathsea kpse, int argc, string *argv)
-{
- int g; /* `getopt' return code. */
- int option_index;
-
- for (;;) {
- g = getopt_long_only (argc, argv, "", long_options, &option_index);
-
- if (g == -1)
- break;
-
- if (g == '?')
- exit (EXIT_FAILURE); /* Unknown option. */
-
- assert (g == 0); /* We have no short option names. */
-
- if (ARGUMENT_IS ("casefold-search")) {
- /* We can't use a boolean for casefold-search because we want to
- distinguish it being set with an option vs. leaving the default
- (by default). */
- xputenv ("texmf_casefold_search", "1");
-
- } else if (ARGUMENT_IS ("cnf-line")) {
- if (user_cnf_lines == NULL) {
- user_cnf_nlines = 1;
- user_cnf_lines = xmalloc (sizeof (const_string));
- } else {
- user_cnf_nlines++;
- user_cnf_lines = xrealloc (user_cnf_lines,
- user_cnf_nlines * sizeof (const_string));
- }
- user_cnf_lines[user_cnf_nlines-1] = xstrdup (optarg);
-
- } else if (ARGUMENT_IS ("debug")) {
- kpse->debug |= atoi (optarg);
-
- } else if (ARGUMENT_IS ("dpi") || ARGUMENT_IS ("D")) {
- dpi = atoi (optarg);
-
- } else if (ARGUMENT_IS ("engine")) {
- engine = optarg;
-
- } else if (ARGUMENT_IS ("expand-braces")) {
- braces_to_expand = optarg;
-
- } else if (ARGUMENT_IS ("expand-path")) {
- path_to_expand = optarg;
-
- } else if (ARGUMENT_IS ("expand-var")) {
- var_to_expand = optarg;
-
- } else if (ARGUMENT_IS ("format")) {
- ENSURE_NONEMPTY_STRING (optarg);
- user_format_string = optarg;
-
- } else if (ARGUMENT_IS ("help")) {
- help_message (kpse, argv);
-
- } else if (ARGUMENT_IS ("help-formats")) {
- help_formats (kpse, argv);
-
- } else if (ARGUMENT_IS ("mktex")) {
- kpathsea_maketex_option (kpse, optarg, true);
- must_exist = 1; /* otherwise it never gets called */
-
- } else if (ARGUMENT_IS ("mode")) {
- mode = optarg;
-
- } else if (ARGUMENT_IS ("no-casefold-search")) {
- xputenv ("texmf_casefold_search", "0");
-
- } else if (ARGUMENT_IS ("no-mktex")) {
- kpathsea_maketex_option (kpse, optarg, false);
- must_exist = 0;
-
- } else if (ARGUMENT_IS ("path")) {
- user_path = optarg;
-
- } else if (ARGUMENT_IS ("progname")) {
- progname = optarg;
-
- } else if (ARGUMENT_IS ("safe-in-name")) {
- ENSURE_NONEMPTY_STRING (optarg);
- safe_in_name = optarg;
-
- } else if (ARGUMENT_IS ("safe-out-name")) {
- ENSURE_NONEMPTY_STRING (optarg);
- safe_out_name = optarg;
-
- } else if (ARGUMENT_IS ("show-path")) {
- path_to_show = optarg;
- user_format_string = optarg;
-
- } else if (ARGUMENT_IS ("subdir")) {
- str_list_add (&subdir_paths, optarg);
-
- } else if (ARGUMENT_IS ("var-brace-value")) {
- ENSURE_NONEMPTY_STRING (optarg);
- var_to_brace_value = optarg;
-
- } else if (ARGUMENT_IS ("var-value")) {
- ENSURE_NONEMPTY_STRING (optarg);
- var_to_value = optarg;
-
- } else if (ARGUMENT_IS ("version")) {
- puts (kpathsea_version_string);
- puts ("Copyright 2021 Karl Berry & Olaf Weber.\n\
-License LGPLv2.1+: GNU Lesser GPL version 2.1 or later <https://gnu.org/licenses/lgpl.html>\n\
-This is free software: you are free to change and redistribute it.\n\
-There is NO WARRANTY, to the extent permitted by law.\n");
- exit (0);
- }
-
- /* Else it was just a flag; getopt has already done the assignment. */
- }
-
- if (user_path && user_format_string) {
- fprintf (stderr,
- "kpsewhich: -path (%s) and -format (%s) are mutually exclusive.\n",
- user_path, user_format_string);
- fputs ("Try `kpsewhich --help' for more information.\n", stderr);
- exit (EXIT_FAILURE);
- }
-
- if (optind == argc
- && !var_to_expand && !braces_to_expand && !path_to_expand
- && !path_to_show && !var_to_value && !var_to_brace_value
- && !safe_in_name && !safe_out_name) {
- fputs ("Missing argument. Try `kpsewhich --help' for more information.\n",
- stderr);
- exit (EXIT_FAILURE);
- }
-}
-
-
-
-/* Initializations that may depend on the options. */
-
-static void
-init_more (kpathsea kpse)
-{
- if (engine)
- kpathsea_xputenv (kpse, "engine", engine);
-
- /* We want config lines from the command line to override config files. */
- if (user_cnf_lines) {
- unsigned i;
- for (i = 0; i < user_cnf_nlines; i++) {
- kpathsea_cnf_line_env_progname (kpse, user_cnf_lines[i]);
- free (user_cnf_lines[i]);
- }
- }
-
- /* Disable all mktex programs unless they were explicitly enabled on our
- command line. */
-#define DISABLE_MKTEX(fmt) \
-kpathsea_set_program_enabled (kpse, fmt, false, kpse_src_cmdline - 1)
- DISABLE_MKTEX (kpse_pk_format);
- DISABLE_MKTEX (kpse_mf_format);
- DISABLE_MKTEX (kpse_tex_format);
- DISABLE_MKTEX (kpse_tfm_format);
- DISABLE_MKTEX (kpse_fmt_format);
- DISABLE_MKTEX (kpse_ofm_format);
- DISABLE_MKTEX (kpse_ocp_format);
-
- /* NULL for no fallback font. */
- kpathsea_init_prog (kpse, uppercasify (kpse->program_name), dpi, mode, NULL);
-
- /* Have to do this after setting the program name. */
- if (user_format_string) {
- user_format = find_format (kpse, user_format_string, false);
- if (user_format == kpse_last_format) {
- WARNING1 ("kpsewhich: Ignoring unknown file type `%s'",
- user_format_string);
- }
- }
-}
-
-
-
-int
-main (int argc, string *argv)
-{
-#ifdef WIN32
-#define puts(s) kpathsea_win32_puts(kpse, (s))
- string *av, enc;
- int ac;
-#endif /* WIN32 */
- unsigned unfound = 0;
- kpathsea kpse = kpathsea_new ();
-
- /* Read options, then dependent initializations. */
- read_command_line (kpse, argc, argv);
-
- kpathsea_set_program_name (kpse, argv[0], progname);
-#ifdef WIN32
- if(strstr(kpse->program_name,"xetex") || strstr(kpse->program_name,"xelatex")
- || strstr(kpse->program_name,"uptex") || strstr(kpse->program_name,"uplatex")
- || strstr(kpse->program_name,"pdftex") || strstr(kpse->program_name,"pdflatex")
- || strstr(kpse->program_name,"dvipdfm") || strstr(kpse->program_name,"extractbb")
- || strstr(kpse->program_name,"xbb") || strstr(kpse->program_name,"ebb")
- || strstr(kpse->program_name,"dvips") || strstr(kpse->program_name,"upmendex"))
- {
- if (strstr(kpse->program_name,"upmendex"))
- enc = "utf-8";
- else
- enc = kpathsea_var_value (kpse, "command_line_encoding");
- if (kpathsea_get_command_line_args_utf8(kpse, enc, &ac, &av)) {
- optind = 0;
- read_command_line (kpse, ac, av);
- argv = av;
- argc = ac;
- }
- }
-#endif /* WIN32 */
- init_more (kpse);
-
-
- /* Perform actions. */
-
- /* Variable expansion. */
- if (var_to_expand)
- puts (kpathsea_var_expand (kpse, var_to_expand));
-
- /* Brace expansion. */
- if (braces_to_expand)
- puts (kpathsea_brace_expand (kpse, braces_to_expand));
-
- /* Path expansion. */
- if (path_to_expand)
- puts (kpathsea_path_expand (kpse, path_to_expand));
-
- /* Show a search path. */
- if (path_to_show) {
- if (user_format != kpse_last_format) {
- if (!kpse->format_info[user_format].type) {
- /* needed if arg was numeric */
- kpathsea_init_format (kpse, user_format);
- }
- puts (kpse->format_info[user_format].path);
- } else {
- WARNING1 ("kpsewhich: Unknown file type, cannot show path: %s",
- path_to_show);
- }
- }
-
- /* Var to value. */
- if (var_to_value) {
- const_string value = kpathsea_var_value (kpse, var_to_value);
- if (!value) {
- unfound++;
- value = "";
- }
- puts (value);
- }
-
- /* Var to brace-expanded value. This is separate from --var-value for
- compatibility; people use --var-value for non-path values, where
- changing commas to colons, which brace expansion does, is not right. */
- if (var_to_brace_value) {
- const_string value = kpathsea_var_value (kpse, var_to_brace_value);
- if (!value) {
- unfound++;
- value = "";
- } else {
- /* Sometimes users want the fully-expanded (as a string, no
- filesystem checks) value. We can't call brace_expand as part of
- kpathsea_var_value, though, because unfortunately it is not
- reentrant. We use var_value in lots of places in the source,
- and it clobbers the static buffer in the kpse structure. */
- value = kpathsea_brace_expand (kpse, value);
- }
- puts (value);
- }
-
- if (safe_in_name) {
- if (!kpathsea_in_name_ok_silent (kpse, safe_in_name))
- unfound++;
- }
-
- if (safe_out_name) {
- if (!kpathsea_out_name_ok_silent (kpse, safe_out_name))
- unfound++;
- }
-
- /* --subdir must imply --all, since we filter here after doing the
- search, rather than inside the search itself. */
- if (!STR_LIST_EMPTY (subdir_paths)) {
- show_all = 1;
- }
-
- /* Usual case: look up each given filename. */
- for (; optind < argc; optind++) {
- unfound += lookup (kpse, argv[optind]);
- }
-
- if (interactive) {
- for (;;) {
- string name = read_line (stdin);
- if (!name || STREQ (name, "q") || STREQ (name, "quit"))
- break;
- unfound += lookup (kpse, name);
- free (name);
- }
- }
-
- kpathsea_finish (kpse);
- return unfound > 255 ? 1 : unfound;
-}