This is kpsewhich.c in view mode; [Download] [Up]
/* kpsewhich -- standalone path lookup and variable expansion for Kpathsea.
Ideas from Tom Esser and Pierre MacKay.
Copyright (C) 1995 Karl Berry.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <kpathsea/config.h>
#include <kpathsea/getopt.h>
#include <kpathsea/line.h>
#include <kpathsea/proginit.h>
#include <kpathsea/progname.h>
#include <kpathsea/tex-file.h>
#include <kpathsea/tex-glyph.h>
#include <kpathsea/variable.h>
/* Base resolution. (-D, -dpi) */
unsigned dpi = 300;
/* A construct to do variable expansion on. (-expand) */
string expand = NULL;
/* The file type for lookups. (-format) */
kpse_file_format_type format = kpse_last_format;
/* Ask interactively? (-interactive) */
boolean interactive = false;
/* The device name, for $MAKETEX_MODE. (-mode) */
string mode = NULL;
/* The program name, for `.program' in texmf.cnf. (-program) */
string progname = NULL;
/* Return the <number> substring in `<name>.<number><stuff>', if S has
that form. If it doesn't, return 0. */
static unsigned
find_dpi P1C(string, s)
{
unsigned dpi_number = 0;
string extension = find_suffix (s);
if (extension != NULL)
sscanf (extension, "%u", &dpi_number);
return dpi_number;
}
/* Use the -format if specified, else guess dynamically from NAME. */
/* We could partially initialize this array from `kpse_format_info',
but it doesn't seem worth the trouble. */
static const_string suffix[]
= { "gf", "pk", "", ".base", ".bib", ".bst", ".cnf", ".fmt", ".mf",
".pool", ".eps", ".tex", ".pool", ".tfm", ".vf", ".ps", ".pfa" };
static kpse_file_format_type
find_format P1C(string, name)
{
kpse_file_format_type ret;
if (format != kpse_last_format)
ret = format;
else
{
unsigned name_len = strlen (name);
for (ret = 0; ret < kpse_last_format; ret++)
{
const_string suffix_try = suffix[ret];
unsigned try_len = strlen (suffix_try);
if (try_len && try_len < name_len
&& STREQ (suffix_try, name + name_len - try_len))
break;
}
if (ret == kpse_last_format)
{
fprintf (stderr,
"kpsewhich: Can't guess format for %s, using tex.\n", name);
ret = kpse_tex_format;
}
}
return ret;
}
/* Look up a single filename NAME. Return 0 if success, 1 if failure. */
static unsigned
lookup P1C(string, name)
{
string ret;
unsigned local_dpi;
kpse_glyph_file_type glyph_ret;
kpse_file_format_type fmt = find_format (name);
switch (fmt)
{
case kpse_pk_format:
case kpse_gf_format:
case kpse_any_glyph_format:
/* Try to extract the resolution from the name. */
local_dpi = find_dpi (name);
if (!local_dpi)
local_dpi = dpi;
ret = kpse_find_glyph (remove_suffix (name), local_dpi, fmt, &glyph_ret);
break;
default:
ret = kpse_find_file (name, fmt, false);
}
if (ret)
puts (ret);
return ret == NULL;
}
/* Reading the options. */
#define USAGE "Options:\n\
You can use `--' or `-' to start an option.\n\
You can use any unambiguous abbreviation for an option name.\n\
You can separate option names and values with `=' or ` '.\n\
debug <integer>: set debugging flags.\n\
D, dpi <unsigned>: use a base resolution of <unsigned>; default 300.\n\
expand <string>: do variable expansion on <string>.\n\
help: print this message and exit.\n\
interactive: ask for additional filenames to look up.\n\
mode <string>: set device name for $MAKETEX_MODE to <string>; no default.\n\
version: print version number and exit.\n\
"
/* Test 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)
/* SunOS cc can't initialize automatic structs. */
static struct option long_options[]
= { { "debug", 1, 0, 0 },
{ "dpi", 1, 0, 0 },
{ "D", 1, 0, 0 },
{ "expand", 1, 0, 0 },
{ "format", 1, 0, 0 },
{ "help", 0, 0, 0 },
{ "interactive", 0, (int *) &interactive, 1 },
{ "mode", 1, 0, 0 },
{ "program", 1, 0, 0 },
{ "version", 0, 0, 0 },
{ 0, 0, 0, 0 } };
/* We return the name of the font to process. */
static void
read_command_line P2C(int, argc, string *, argv)
{
int g; /* `getopt' return code. */
int option_index;
while (true)
{
g = getopt_long_only (argc, argv, "", long_options, &option_index);
if (g == EOF)
break;
if (g == '?')
exit (1); /* Unknown option. */
assert (g == 0); /* We have no short option names. */
if (ARGUMENT_IS ("debug"))
kpathsea_debug |= atoi (optarg);
else if (ARGUMENT_IS ("dpi") || ARGUMENT_IS ("D"))
dpi = atoi (optarg);
else if (ARGUMENT_IS ("expand"))
expand = optarg;
else if (ARGUMENT_IS ("format"))
format = atoi (optarg);
else if (ARGUMENT_IS ("help"))
{
printf ("Usage: %s [options] [filenames].\n", argv[0]);
fputs (USAGE, stdout);
exit (0);
}
else if (ARGUMENT_IS ("mode"))
mode = optarg;
else if (ARGUMENT_IS ("program"))
progname = optarg;
else if (ARGUMENT_IS ("version"))
{
extern char *kpathsea_version_string; /* from version.c */
printf ("%s.\n", kpathsea_version_string);
exit (0);
}
/* Else it was just a flag; getopt has already done the assignment. */
}
}
int
main P2C(int, argc, string *, argv)
{
unsigned unfound = 0;
read_command_line (argc, argv);
if (!progname)
progname = (string) "";
kpse_set_progname (progname);
/* false for no MakeTeXPK, NULL for no fallback font. */
kpse_init_prog (uppercasify (progname), dpi, mode, false, NULL);
/* No extra frills on expansion output, to make it easy to use. */
if (expand)
puts (kpse_var_expand (expand));
for (; optind < argc; optind++)
{
unfound += lookup (argv[optind]);
}
if (interactive)
{
for (;;)
{
string name = read_line (stdin);
if (!name || STREQ (name, "q") || STREQ (name, "quit")) break;
unfound += lookup (name);
free (name);
}
}
exit (unfound);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.