summaryrefslogtreecommitdiff
path: root/Build/source/texk/kpathsea/win32/mktextfm.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/kpathsea/win32/mktextfm.c')
-rw-r--r--Build/source/texk/kpathsea/win32/mktextfm.c441
1 files changed, 441 insertions, 0 deletions
diff --git a/Build/source/texk/kpathsea/win32/mktextfm.c b/Build/source/texk/kpathsea/win32/mktextfm.c
new file mode 100644
index 00000000000..e09e99237b2
--- /dev/null
+++ b/Build/source/texk/kpathsea/win32/mktextfm.c
@@ -0,0 +1,441 @@
+/* mktextfm.c
+
+ Copyright 2000, 2020 Akira Kakuto.
+
+ 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/>.
+
+ Assumes the ljfour mode in mf.base .
+ Usage: mktextfm [--destdir DESTDIR] name
+*/
+
+#include <kpathsea/kpathsea.h>
+#ifndef __MINGW32__
+#include <web2c/w2c/c-auto.h>
+#endif
+#include "mktex.h"
+
+#define TBUF 512
+
+char *progname;
+
+static void
+usage (void)
+{
+ fprintf (stderr, "Usage: %s [--destdir destdir] name\n", progname);
+ return;
+}
+
+static void
+version (void)
+{
+ fprintf (stderr, "%s, (C version 1.6 --ak 2009-2020)\n", progname);
+ fprintf (stderr, KPSEVERSION WEB2CVERSION "\n");
+ return;
+}
+
+static void
+help (void)
+{
+ fprintf (stderr, "Usage (1): %s name\n", progname);
+ fprintf (stderr, " tfm is saved following TDS\n");
+ fprintf (stderr, "Usage (2): %s --destdir destdir name\n", progname);
+ fprintf (stderr, " destdir must be an absolute path of dir\n");
+ fprintf (stderr, "Usage (3): %s --version\n", progname);
+ fprintf (stderr, "Usage (4): %s --help\n", progname);
+
+ return;
+}
+
+static void
+relmem (char **v)
+{
+ int j;
+ for (j = 0; j < 4; j++)
+ free (v[j]);
+ return;
+}
+
+int
+main (int ac, char **av)
+{
+ char rbuff[TBUF];
+ char buff[TBUF];
+ char savebuff[TBUF];
+ char cmd[TBUF];
+ char mffile[TBUF];
+ char *arg[4];
+ static char execfile[TBUF];
+
+ char kpsedot[TBUF];
+ char currdir[TBUF];
+ char *tmp;
+ int cdrive, tdrive;
+
+ FILE *fr, *fw, *fnul;
+
+ int i, savo, savi;
+ char *p, *fp, *fpp;
+ int issetdest;
+ char fontname[TBUF];
+
+ char texbindir[TBUF];
+ char fullbin[TBUF];
+ char *extra_info;
+
+ kpse_set_program_name (av[0], NULL);
+ progname = kpse_program_name;
+
+/*
+ * get tex binary dir
+ *
+ */
+ p = kpse_var_value("SELFAUTOLOC");
+ if(p == 0) {
+ fprintf(stderr, "I cannot get SELFAUTOLOC\n");
+ exit(100);
+ }
+ strcpy(texbindir, p);
+ free(p);
+ for(p=texbindir; *p; p++) {
+ if(*p == '/') *p = '\\';
+ }
+ *p = '\\';
+ *(p+1) = '\0';
+
+ tmp = getenv ("TEMP");
+ if (!tmp)
+ tmp = getenv ("TMP");
+ if (!tmp)
+ tmp = getenv ("TMPDIR");
+ if (!tmp) {
+ fprintf (stderr, "Please define TEMP | TMP | TMPDIR.\n");
+ return (100);
+ }
+
+ tmp = xstrdup(tmp);
+
+ for (fpp = tmp; *fpp; fpp++) {
+ if (IS_KANJI(fpp))
+ fpp++;
+ else if (*fpp == '\\')
+ *fpp = '/';
+ }
+/*
+issetdest = 0 : TDS
+issetdest = 1 : user setting
+issetdest = 2 : current directory
+*/
+
+ issetdest = 0;
+
+ if (ac < 2) {
+ usage ();
+ free(tmp);
+ return (100);
+ }
+
+ if ((!strcmp (av[1], "--version")) || (!strcmp (av[1], "-version"))) {
+ version ();
+ free(tmp);
+ return (100);
+ }
+
+ if ((!strcmp (av[1], "--help")) || (!strcmp (av[1], "-help"))) {
+ help ();
+ free(tmp);
+ return (100);
+ }
+
+ for (i = 0; i < 4; i++)
+ arg[i] = (char *) malloc (TBUF);
+
+ if ((!strcmp (av[1], "--destdir")) || (!strcmp (av[1], "-destdir"))) {
+ if (ac != 4) {
+ usage ();
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ issetdest = 1;
+ if (strlen(av[2]) > TBUF - 1 || strlen(av[3]) > TBUF - 150) {
+ fprintf (stderr, "Too long a string.\n");
+ return (100);
+ }
+ strcpy (buff, av[2]);
+ strcpy (fontname, av[3]);
+ for (p = buff; *p; p++) {
+ if (IS_KANJI(p))
+ p++;
+ else if (*p == '\\')
+ *p = '/';
+ }
+ } else {
+ if (strlen(av[1]) > TBUF - 150) {
+ fprintf (stderr, "Too long a string.\n");
+ return (100);
+ }
+ strcpy (fontname, av[1]);
+ }
+
+
+ /* fontname = font name
+ */
+ if ((p = strrchr (fontname, '.')))
+ *p = '\0';
+
+ /* mffile is METAFONT file name
+ */
+ strcpy (mffile, fontname);
+ strcat (mffile, ".mf");
+
+ if (!(fp = kpse_var_value ("MFINPUTS"))) {
+ fprintf (stderr, "Cannot get value of MFINPUTS\n");
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+
+ free (fp);
+
+ xputenv("MKTEXMF", "1");
+ if (!(p = kpse_find_file (mffile, kpse_mf_format, 1))) {
+ fprintf (stderr, "Cannot find %s.\n", mffile);
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+
+ fpp = _getcwd (currdir, TBUF);
+ if (!fpp) {
+ fprintf (stderr, "Failed to get current working directory.\n");
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ for (fpp = currdir; *fpp; fpp++) {
+ if (IS_KANJI(fpp))
+ fpp++;
+ else if (*fpp == '\\')
+ *fpp = '/';
+ }
+
+ i = (int)strlen (currdir);
+ if (currdir[i - 1] == '/')
+ currdir[i - 1] = '\0';
+ strcpy (kpsedot, "KPSE_DOT=.;");
+ strcat (kpsedot, currdir);
+ _putenv (kpsedot);
+
+ if ((p[0] == '.') && (p[1] == '/') && (issetdest != 1)) {
+ issetdest = 2;
+ strcpy (buff, currdir);
+ }
+
+ if (issetdest == 0) {
+ /* now path of ${name}.mf is in p */
+ strcpy (arg[0], "Dummy");
+ strcpy (arg[1], "tfm");
+ strcpy (arg[2], p);
+
+ if (!(p = getdestdir (3, arg))) {
+ fprintf (stderr, "Cannot get destination directory name.\n");
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ strcpy (buff, p);
+ }
+
+/* Now buff is the destdir */
+ p = buff;
+
+ i = (int)strlen (p);
+
+ if (p[i - 1] != '/')
+ strcat (p, "/");
+ strcat (p, fontname);
+ strcat (p, ".tfm");
+
+/* now p (or buff) is the full path name of the tfm font */
+/* check if it exists */
+ if (_access (p, 0) == 0) {
+ fprintf (stderr, "%s exists\n", p);
+ printf ("%s\n", p);
+ relmem (arg);
+ free(tmp);
+ return (0);
+ }
+
+ cdrive = _getdrive ();
+ if (tmp[1] == ':') {
+ tdrive = tolower (*tmp) - 'a' + 1;
+ _chdrive (tdrive);
+ }
+ _chdir (tmp);
+
+/* save stdout and stdin */
+ savo = _dup (fileno (stdout));
+ savi = _dup (fileno (stdin));
+
+/* connect stdout to stderr */
+ _dup2 (fileno (stderr), fileno (stdout));
+
+/* connect stdin to nul device */
+ if (!(fnul = fopen ("nul", "r"))) {
+ fprintf (stderr, "Cannot open nul device to read\n");
+ relmem (arg);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ free(tmp);
+ return (100);
+ }
+ _dup2 (fileno (fnul), fileno (stdin));
+
+/* METAFONT command line */
+/*
+The idea here is to provide a programmatic way to get the
+codingscheme and other so-called Xerox-world information into the
+tfm: if the envvar MF_MODE_EXTRA_INFO is set, then modes.mf (as of
+the 3.9 release in January 2020) will arrange for that. We do not
+do this by default because Knuth objected.
+*/
+ extra_info = getenv("MF_MODE_EXTRA_INFO");
+ strcpy (cmd, "--progname=mf --base=mf ");
+ strcat (cmd, "\\mode:=ljfour; mag:=1; ");
+ if (extra_info) {
+ strcat(cmd, "if known mode_include_extra_info_available: ");
+ strcat(cmd, "mode_include_extra_info fi; ");
+ }
+ strcat (cmd, "nonstopmode; input ");
+ strcat (cmd, fontname);
+ strcat (cmd, ";");
+
+ strcpy (execfile, "mf-nowin.exe");
+ fprintf (stderr, "%s %s\n", execfile, cmd);
+ strcpy(fullbin, texbindir);
+ strcat(fullbin, execfile);
+ (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, NULL);
+
+/* return to original stdout and stdin */
+ _dup2 (savo, fileno (stdout));
+ close (savo);
+ _dup2 (savi, fileno (stdin));
+ close (savi);
+
+/* close nul device */
+ fclose (fnul);
+
+/* check consistency */
+ strcpy (cmd, fontname);
+ strcat (cmd, ".600gf");
+
+ if (_access (cmd, 0) == -1) {
+ fprintf (stderr, "METAFONT failed to make gf font.\n");
+ relmem (arg);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ free(tmp);
+ return (100);
+ }
+
+ remove (cmd);
+
+ strcpy (cmd, fontname);
+ strcat (cmd, ".tfm");
+
+/* copy the tfm file */
+ if (!(fr = fopen (cmd, "rb"))) {
+ fprintf (stderr, "Cannot open %s to read\n", cmd);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ if (!(fw = fopen (buff, "wb"))) {
+ fprintf (stderr, "Cannot open %s to write\n", buff);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+
+ while ((i = (int)fread (rbuff, 1, TBUF, fr)))
+ fwrite (rbuff, 1, i, fw);
+ fclose (fr);
+ fclose (fw);
+
+ strcpy(savebuff, buff);
+
+/*
+ copy log file into the current directory
+ in the case that issetdest == 2,
+ because feynmf package requires the
+ log file.
+*/
+
+ if(issetdest == 2) {
+ i = (int)strlen(buff);
+ if(i > 3) {
+ i -= 4;
+ buff[i] = '\0';
+ strcat(buff, ".log");
+ strcpy(cmd, fontname);
+ strcat(cmd, ".log");
+ if (!(fr = fopen (cmd, "rb"))) {
+ fprintf (stderr, "Cannot open %s to read\n", cmd);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ if (!(fw = fopen (buff, "wb"))) {
+ fprintf (stderr, "Cannot open %s to write\n", buff);
+ _chdrive (cdrive);
+ _chdir (currdir);
+ relmem (arg);
+ free(tmp);
+ return (100);
+ }
+ while ((i = (int)fread (rbuff, 1, TBUF, fr)))
+ fwrite (rbuff, 1, i, fw);
+ fclose (fr);
+ fclose (fw);
+ }
+ }
+
+ relmem (arg);
+ if(issetdest != 2)
+ mktexupd (savebuff);
+
+/* erase files */
+ strcpy (cmd, fontname);
+ strcat (cmd, ".log");
+ remove (cmd);
+
+ strcpy (cmd, fontname);
+ strcat (cmd, ".tfm");
+ remove (cmd);
+
+ _chdrive (cdrive);
+ _chdir (currdir);
+
+/* send message to Kpathsea */
+ printf ("%s\n", savebuff);
+ free(tmp);
+
+ return (0);
+}