summaryrefslogtreecommitdiff
path: root/Build/source/texk/kpathsea/win32/fmtutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/kpathsea/win32/fmtutil.c')
-rw-r--r--Build/source/texk/kpathsea/win32/fmtutil.c960
1 files changed, 960 insertions, 0 deletions
diff --git a/Build/source/texk/kpathsea/win32/fmtutil.c b/Build/source/texk/kpathsea/win32/fmtutil.c
new file mode 100644
index 00000000000..6a9252f8110
--- /dev/null
+++ b/Build/source/texk/kpathsea/win32/fmtutil.c
@@ -0,0 +1,960 @@
+/*
+
+Try TEXMFVAR as a head directory, if not defined try TEXMFMAIN next.
+
+
+fmtutil.c (2002/10/06 --ak)
+Web2C-7.3.9 (2002/10/25 --ak)
+Web2C-7.4.2 (2002/12/27 --ak)
+Web2C-7.4.3 (2003/01/12 --ak)
+Web2C-7.5.2 (2003/11/09 --ak)
+Web2C-7.5.3 (2004/05/09 --ak)
+Web2C-7.5.3 (2004/06/11 --ak)
+Web2C-7.5.5 (2005/12/23 --ak)
+Web2C-7.5.5 (2006/11/25 --ak)
+Web2C-7.5.6 (2007/06/01 --ak) save log files.
+Web2C-7.5.6 (2008/01/20 --ak) Create necessary directories.
+Web2C-2009 (2009/06/11 --ak) error handling.
+Web2C-2009 (2009/08/13 Nobert) new option --byengine
+Web2C-2009 (2009/10/10 --ak) creates mplib-luatex.mem.
+Web2C-2010 (2010/05/31 --ak) multiple language files.
+Web2C-2010 (2010/07/03 --ak) new options.
+*/
+
+#include <kpathsea/kpathsea.h>
+
+#include "dirutil.h"
+#include "mktexupd.h"
+
+#ifndef __MINGW32__
+#undef system
+#define system win32_system
+#endif
+
+#define BLEN 512
+#define SLEN 256
+#define MAXFMT 128
+#define SIXTY4 64
+#define SIXTEEN 16
+#define DEFAULTCNF "fmtutil.cnf"
+#define REVISION "fmtutil (C version 0.7) 2002-2010 --ak"
+
+typedef struct {
+char *format;
+char *engine;
+char *hyphen;
+char *args;
+} cmd_t;
+
+/*
+Global variables
+*/
+cmd_t K[MAXFMT];
+int Fmtnum = 0;
+char Buff[BLEN];
+char Programname[BLEN];
+char Enginename[BLEN];
+char Realenginename[BLEN];
+char Destdir[BLEN];
+char Currdir[BLEN];
+char *Exefile[MAXFMT];
+unsigned char Exenum = 0;
+int Errorcnt = 0;
+int UserDestdir = 0;
+int QQQ = 0; /* quiet */
+
+static void
+revision(void)
+{
+ printf(REVISION "\n");
+}
+
+static void
+usage(void)
+{
+ printf(
+"Commands:\n"
+" --all recreate all format, base, mem files\n"
+" --missing create all missing format, base, mem files\n"
+" --refresh recreate existing format, base, mem files\n"
+" --byfmt FORMATNAME (re)create format for `FORMATNAME'\n"
+" `base' and `mem' files can also be created\n"
+" --byhyphen HYPHENFILE (re)create formats that depend on `HYPHENFILE'\n"
+" --byengine ENGINENAME (re)create formats that depend on `ENGINENAME'\n"
+" --showhyphen FORMATNAME print name of hyphenfile for format `FORMATNAME'\n"
+" --version show revision number\n"
+" --help show this message\n"
+" --enablefmt FORMATNAME (not implemented)\n"
+" --disablefmt FORMATNAME (not implemented)\n"
+" --listcfg (not implemented)\n"
+" --catcfg (not implemented)\n"
+" --edit (not implemented)\n"
+"\n"
+"Options:\n"
+" --cnffile FILE set configfile for fmtutil\n"
+" default is `fmtutil.cnf'\n"
+" --fmtdir DIRECTORY set destination directory for format files\n"
+" `DIRECTORY' must be an absolute path\n"
+" default is $TEXMFVAR/web2c/$engine\n"
+" or $TEXMFMAIN/web2c/$engine if TEXMFVAR is undefined\n"
+" --engine TEXENGINE specify the TeX engine (with --byfmt fmtname)\n"
+" --quiet be silent\n"
+" --no-error-if-no-format (just for compatibility)\n"
+" --no-engine-subdir (not implemented)\n"
+" --test (not implemented)\n"
+" --dolinks (not implemented)\n"
+" --force (not implemented)\n");
+}
+
+static void
+freeK(void)
+{
+ int i;
+ for(i=0; i < MAXFMT; i++) {
+ free(K[i].format);
+ free(K[i].engine);
+ free(K[i].hyphen);
+ free(K[i].args);
+ free(Exefile[i]);
+ }
+}
+
+static int
+do_initex(char *fm, char *en, char *args)
+{
+ int ret, lsrflag;
+ char fmt[BLEN];
+ char ext[SIXTEEN];
+ char cmd[BLEN];
+ char progn[BLEN];
+ char progn2[BLEN];
+ char enginesubdir[BLEN];
+ char src[BLEN];
+ char dst[BLEN];
+ char logdst[BLEN];
+ char log[BLEN];
+ char fullbin[256], *pp;
+
+ if(!strnicmp(fm, "cont", 4)) strcpy(progn, "context");
+ else if(!strnicmp(fm, "ptex-", 5)) strcpy(progn, "ptex");
+ else if(!strnicmp(fm, "platex-", 7)) strcpy(progn, "platex");
+ else strcpy(progn, fm);
+
+ strcpy(enginesubdir, en);
+
+ if(!stricmp(enginesubdir, "mf-nowin"))
+ strcpy(enginesubdir, "metafont");
+ if(!stricmp(enginesubdir, "mf"))
+ strcpy(enginesubdir, "metafont");
+ if(!stricmp(enginesubdir, "mpost"))
+ strcpy(enginesubdir, "metapost");
+
+ if(!stricmp(en, "mf-nowin")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".base");
+ }
+ else if(!stricmp(en, "mf")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".base");
+ }
+ else if(!stricmp(en, "mpost")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".mem");
+ }
+ else if(!stricmp(en, "pmpost")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".mem");
+ }
+ else if(!stricmp(en, "upmpost")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".mem");
+ }
+ else if(!stricmp(en, "mp641")) {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".mem");
+ }
+ else if(!stricmp(en, "nts")) {
+ strcpy(fmt, "--fmt=");
+ strcpy(ext, ".nfmt");
+ }
+ else {
+ strcpy(fmt, "--jobname=");
+ strcpy(ext, ".fmt");
+ }
+
+ if(!stricmp(en, "pmpost") || !stricmp(en, "mpost")
+ || !stricmp(en, "upmpost") || !stricmp(en, "mp641"))
+ strcpy(progn2, "mpost");
+ else if(!stricmp(en, "mf-nowin"))
+ strcpy(progn2, "mf");
+ else if(!stricmp(en, "nts"))
+ strcpy(progn2, "tex");
+ else strcpy(progn2, progn);
+
+ pp = kpse_var_value("SELFAUTOLOC");
+ if(pp == NULL) {
+ fprintf(stderr, "I cannot get SELFAUTOLOC\n");
+ exit(100);
+ }
+ fullbin[0] = '\"';
+ fullbin[1] = '\0';
+ strcat(fullbin, pp);
+ free(pp);
+ for(pp=fullbin; *pp; pp++) {
+ if(*pp == '/') *pp = '\\';
+ }
+ strcat(fullbin, "\\");
+ strcat(fullbin, en);
+ strcat(fullbin, "\"");
+
+ if(!stricmp(en, "nts"))
+ sprintf(cmd, "%s --ini --progname=%s %s <nul",
+ fullbin, progn2, args);
+ else
+ sprintf(cmd, "%s --ini %s%s --progname=%s %s <nul",
+ fullbin, fmt, fm, progn2, args);
+
+ if(QQQ == 0)
+ fprintf(stderr, "Running: %s\n", cmd);
+ ret = system(cmd);
+ strcpy(src, fm);
+ strcpy(log, fm);
+ strcat(log, ".log");
+ strcat(src, ext);
+ strcpy(dst, Destdir);
+
+ if((UserDestdir == 0) && stricmp(enginesubdir, "nts")) {
+ strcat(dst, enginesubdir);
+ if(!is_dir(dst)) {
+ if(make_dir(dst)) {
+ fprintf(stderr, "Failed to make format in %s.\n", dst);
+ return (-100);
+ }
+ }
+ strcat(dst, "/");
+ }
+
+ strcpy(logdst, dst);
+ strcat(logdst, log);
+ strcat(dst, src);
+ if(_access(dst, 0) == 0)
+ lsrflag = 0;
+ else
+ lsrflag = 1;
+
+ if((_access(src, 0) == 0) && ret == 0) {
+ CopyFile(src, dst, FALSE);
+ if(lsrflag) mktexupd(dst);
+ if(stricmp(src, "mpost.mem") == 0) {
+ int len;
+ char *tmpstr;
+ len = strlen(dst);
+ tmpstr = (char *)malloc(len + 10);
+ strcpy(tmpstr, dst);
+ tmpstr[len-9] = '\0';
+ strcat(tmpstr, "mplib-luatex.mem");
+ if(_access(tmpstr, 0) == 0)
+ free(tmpstr);
+ else {
+ CopyFile(src, tmpstr, FALSE);
+ mktexupd(tmpstr);
+ free(tmpstr);
+ }
+ }
+ remove(src);
+ if(_access(logdst, 0) == 0)
+ lsrflag = 0;
+ else
+ lsrflag = 1;
+ if(_access(log, 0) == 0) {
+ CopyFile(log, logdst, FALSE);
+ if(lsrflag) mktexupd(logdst);
+ remove(log);
+ }
+ if(QQQ == 0)
+ fprintf(stderr, "The file %s%s was created.\n", fm, ext);
+ if(!strcmp(progn, "context"))
+ strcpy(Exefile[Exenum], "texexec");
+ else if(!strcmp(en, "nts"))
+ strcpy(Exefile[Exenum], "nts");
+ else
+ strcpy(Exefile[Exenum], fm);
+
+ Exenum++;
+ } else {
+ if(_access(src, 0) == 0)
+ remove(src);
+ if(_access(logdst, 0) == 0)
+ lsrflag = 0;
+ else
+ lsrflag = 1;
+ if(_access(log, 0) == 0) {
+ CopyFile(log, logdst, FALSE);
+ if(lsrflag) mktexupd(logdst);
+ remove(log);
+ }
+ if(QQQ == 0) {
+ fprintf(stderr, "\nThe file %s%s was not created due to some errors.\n",
+ fm, ext);
+ fprintf(stderr, "See the log file %s for details.\n", logdst);
+ }
+ Errorcnt++;
+ ret = -100;
+ }
+ return ret;
+}
+
+static void
+do_all(void)
+{
+ int i;
+
+ for(i = 0; i < Fmtnum; i++)
+ do_initex(K[i].format, K[i].engine, K[i].args);
+}
+
+static void
+show_hyphen(char *fm, char *hfile)
+{
+ char *p, *q, *r;
+ int cont;
+ char progn[BLEN];
+
+ if(!strcmp(hfile, "-")) {
+ printf("%s\n", hfile);
+ return;
+ }
+
+ if(!strnicmp(fm, "cont", 4)) strcpy(progn, "context");
+ else strcpy(progn, fm);
+ if(QQQ == 0)
+ fprintf(stderr, "Searching ... \n");
+ kpse_reset_program_name(progn);
+ q = hfile;
+ cont = 1;
+ while(cont) {
+ for(r=q; *r && *r != ','; r++)
+ ;
+ if(*r == '\0') cont = 0;
+ *r = '\0';
+ r++;
+ p = kpse_find_file(q, kpse_tex_format, 0);
+ if(!p) {
+ if(QQQ == 0)
+ fprintf(stderr, "%s not found.\n", q);
+ q = r;
+ continue;
+ }
+ printf("%s\n", p);
+ free(p);
+ q = r;
+ }
+ kpse_reset_program_name(Programname);
+ return;
+}
+
+static int
+testexe(char *name, const char *suffix)
+{
+ char buffer[BLEN];
+ char *p;
+
+ if(SearchPath(NULL, name, suffix, BLEN, buffer, &p))
+ return 1;
+ else
+ return 0;
+}
+
+int
+main(int ac, char **av)
+{
+ FILE *in;
+
+ int i, j, k;
+ char *cnfname;
+ char *p;
+ char cnffile[BLEN];
+ char fmtname[BLEN];
+ char hyphenfile[BLEN];
+ char byenginename[BLEN];
+ char kpsedot[BLEN];
+ char enginesubdir[BLEN];
+ char *tmp;
+ int cdrive, tdrive;
+
+ int flag;
+
+/*
+flag = 1 : --all
+ 2 : --missing
+ 3 : --byfmt formatname
+ 4 : --byhyphen hyphenfile
+ 5 : --showhyphen formatname
+ 6 : --refresh
+ 7 : --byengine engine
+*/
+
+ flag = 0;
+ cnffile[0] = '\0';
+ fmtname[0] = '\0';
+ hyphenfile[0] = '\0';
+ byenginename[0] = '\0';
+ Destdir[0] = '\0';
+ Currdir[0] = '\0';
+ Enginename[0] = '\0';
+ Realenginename[0] = '\0';
+
+ kpse_set_program_name(av[0], NULL);
+ strcpy(Programname, av[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(p = tmp; *p; p++) {
+ if(*p == '\\')
+ *p = '/';
+ else if (IS_KANJI(p))
+ p++;
+ }
+
+ i = strlen(tmp);
+ if(tmp[i-1] == '/') tmp[i-1] = '\0';
+
+ for(i = 1; i < ac; i++) {
+ if(strlen(av[i]) > BLEN-1) {
+ fprintf(stderr, "\nToo long a string.\n");
+ return 100;
+ }
+ /* --cnffile FILE */
+
+ if(!strncmp(av[i],"--cn", 4) || !strncmp(av[i], "-cn", 3)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ strcpy(cnffile, av[i]);
+ continue;
+ }
+ /* --engine TEXENGINE */
+
+ else if(!strncmp(av[i],"--eng", 5) || !strncmp(av[i], "-eng", 4)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ strcpy(Enginename, av[i]);
+ continue;
+ }
+ /* --fmtdir DIRCTORY */
+
+ else if(!strncmp(av[i],"--fm", 4) || !strncmp(av[i], "-fm", 3)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ strcpy(Destdir, av[i]);
+ UserDestdir = 1;
+ continue;
+ }
+ /* --all */
+
+ else if(!strncmp(av[i],"--a", 3) || !strncmp(av[i], "-a", 2)) {
+ flag = 1;
+ continue;
+ }
+ /* --missing */
+
+ else if(!strncmp(av[i],"--m", 3) || !strncmp(av[i], "-m", 2)) {
+ flag = 2;
+ continue;
+ }
+ /* --refresh */
+
+ else if(!strncmp(av[i],"--r", 3) || !strncmp(av[i], "-r", 2)) {
+ flag = 6;
+ continue;
+ }
+ /* --byfmt FORMATNAME */
+
+ else if(!strncmp(av[i],"--byf", 5) || !strncmp(av[i], "-byf", 4)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ flag = 3;
+ strcpy(fmtname, av[i]);
+ continue;
+ }
+ /* --byhyphen HYPHENFILE */
+
+ else if(!strncmp(av[i],"--byh", 5) || !strncmp(av[i], "-byh", 4)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ flag = 4;
+ strcpy(hyphenfile, av[i]);
+ for(p=hyphenfile; *p; p++) {
+ if(*p == '\\')
+ *p = '/';
+ else if (IS_KANJI(p))
+ p++;
+ }
+ p = strrchr(hyphenfile, '/');
+ if(p) {
+ p++;
+ strcpy(hyphenfile, p);
+ }
+ continue;
+ }
+ /* --byengine ENGINENAME */
+
+ else if(!strncmp(av[i],"--bye", 5) || !strncmp(av[i], "-bye", 4)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ flag = 7;
+ strcpy(byenginename, av[i]);
+ continue;
+ }
+ /* --showhyphen FORMATNAME */
+
+ else if(!strncmp(av[i],"--s", 3) || !strncmp(av[i], "-s", 2)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ flag = 5;
+ strcpy(fmtname, av[i]);
+ continue;
+ }
+ /* --version */
+
+ else if(!strncmp(av[i],"--v", 3) || !strncmp(av[i], "-v", 2)) {
+ revision();
+ return 0;
+ }
+ /* --help */
+
+ else if(!strncmp(av[i],"--h", 3) || !strncmp(av[i], "-h", 2)) {
+ usage();
+ return 0;
+ }
+ /* --enablefmt FORMATNAME */
+
+ else if(!strncmp(av[i],"--ena", 5) || !strncmp(av[i], "-ena", 4)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ fprintf(stderr, "`--enablefmt FORMATNAME' is not implemented.\n");
+ continue;
+ }
+ /* --disablefmt FORMATNAME */
+
+ else if(!strncmp(av[i],"--di", 4) || !strncmp(av[i], "-di", 3)) {
+ i++;
+ if(i >= ac) {
+ fprintf(stderr, "Invalid argument.\n");
+ exit (100);
+ }
+ fprintf(stderr, "`--disablefmt FORMATNAME' is not implemented.\n");
+ continue;
+ }
+ /* --listcfg */
+
+ else if(!strncmp(av[i],"--l", 3) || !strncmp(av[i], "-l", 2)) {
+ fprintf(stderr, "`--listcfg' is not implemented.\n");
+ continue;
+ }
+ /* --catcfg */
+
+ else if(!strncmp(av[i],"--ca", 4) || !strncmp(av[i], "-ca", 3)) {
+ fprintf(stderr, "`--catcfg' is not implemented.\n");
+ continue;
+ }
+ /* --edit */
+
+ else if(!strncmp(av[i],"--ed", 4) || !strncmp(av[i], "-ed", 3)) {
+ fprintf(stderr, "`--edit' is not implemented.\n");
+ continue;
+ }
+ /* --test */
+
+ else if(!strncmp(av[i],"--t", 3) || !strncmp(av[i], "-t", 2)) {
+ fprintf(stderr, "`--test' is not implemented.\n");
+ continue;
+ }
+ /* --dolinks */
+
+ else if(!strncmp(av[i],"--do", 4) || !strncmp(av[i], "-do", 3)) {
+ fprintf(stderr, "`--dolinks' is not implemented.\n");
+ continue;
+ }
+ /* --force */
+
+ else if(!strncmp(av[i],"--fo", 4) || !strncmp(av[i], "-fo", 3)) {
+ fprintf(stderr, "`--force' is not implemented.\n");
+ continue;
+ }
+ /* --no-engine-subdir */
+
+ else if(!strncmp(av[i],"--no-en", 7) || !strncmp(av[i], "-no-en", 6)) {
+ fprintf(stderr, "`--no-engine-subdir' is not implemented.\n");
+ continue;
+ }
+ /* --no-error-if-no-format */
+
+ else if(!strncmp(av[i],"--no-er", 7) || !strncmp(av[i], "-no-er", 6)) {
+ continue;
+ }
+ /* --quiet */
+
+ else if(!strncmp(av[i],"--q", 3) || !strncmp(av[i], "-q", 2)) {
+ QQQ = 1;
+ continue;
+ }
+ else {
+ fprintf(stderr, "%s: Invalid argument.\n\n", av[0]);
+ usage();
+ return 100;
+ }
+ }
+
+ if(flag == 0) {
+ usage();
+ return 100;
+ }
+
+
+ if(!cnffile[0]) strcpy(cnffile, DEFAULTCNF);
+ cnfname = kpse_find_file(cnffile, kpse_web2c_format, 0);
+ if(!cnfname) {
+ fprintf(stderr, "Failed to find cnffile %s.\n", cnffile);
+ exit (100);
+ }
+
+ in = fopen(cnfname, "r");
+ free(cnfname);
+ if(!in) {
+ fprintf(stderr, "Failed to open %s.\n", cnffile);
+ exit (100);
+ }
+
+ for(i=0; i < MAXFMT; i++) {
+ K[i].format = (char *)malloc(BLEN);
+ K[i].engine = (char *)malloc(BLEN);
+ K[i].hyphen = (char *)malloc(BLEN);
+ K[i].args = (char *)malloc(BLEN);
+ Exefile[i] = (char *)malloc(BLEN);
+ }
+
+ i = 0;
+ while(fgets(Buff, BLEN, in)) {
+ if(Buff[0] == '#' ||
+ Buff[0] == '\n' ||
+ Buff[0] == 0x25)
+ continue;
+ p = strtok(Buff, " \t");
+ if(p)
+ strcpy(K[i].format, p);
+ else
+ K[i].format[0] = '\0';
+ p = strtok(NULL, " \t");
+ if(p)
+ strcpy(K[i].engine, p);
+ else
+ K[i].engine[0] = '\0';
+ p = strtok(NULL, " \t");
+ if(p)
+ strcpy(K[i].hyphen, p);
+ else
+ K[i].hyphen[0] = '\0';
+ p = strtok(NULL, "\n");
+ if(p) {
+ while(*p == ' ' || *p == '\t')
+ p++;
+ j = strlen(p);
+ if(*(p+j-1) == '\n')
+ *(p+j-1) = '\0';
+ strcpy(K[i].args, p);
+ }
+ else
+ K[i].args[0] = '\0';
+
+ if(!K[i].format[0] ||
+ !K[i].engine[0] ||
+ !K[i].hyphen[0] ||
+ !K[i].args) {
+ fprintf(stderr, "Invalid line in %s.\n", cnffile);
+ freeK();
+ return (100);
+ }
+ i++;
+ if(i > MAXFMT) {
+ fprintf(stderr, "Too many lines in %s.\n", cnffile);
+ freeK();
+ return (100);
+ }
+ }
+
+ Fmtnum = i;
+ fclose(in);
+
+ j = 0;
+ if(flag == 5) {
+ for(i = 0; i < Fmtnum; i++) {
+ if(!stricmp(K[i].format, fmtname)) {
+ show_hyphen(K[i].format, K[i].hyphen);
+ j++;
+ }
+ }
+ if(j == 0)
+ fprintf(stderr, "argument of --showhyphen must be a format name.\n");
+ freeK();
+ return 1;
+ }
+
+ if(stricmp(Programname, "fmtutil-sys") == 0) {
+ char *px = kpse_var_value("TEXMFSYSVAR");
+ if(px) {
+ xputenv("TEXMFVAR", px);
+ }
+ }
+
+ if(UserDestdir == 0) {
+ p = kpse_var_value("TEXMFVAR");
+ if(!p)
+ p = kpse_var_value("TEXMFMAIN");
+ if(!p) {
+ fprintf(stderr, "TEXMFMAIN not defined.\n");
+ freeK();
+ return 100;
+ }
+ strcpy(Destdir, p);
+ free(p);
+ for(p = Destdir; *p ; p++) {
+ if(*p == '\\')
+ *p = '/';
+ else if (IS_KANJI(p))
+ p++;
+ }
+
+ i = strlen(Destdir);
+ while (Destdir[i-1] == '/')
+ i--;
+ Destdir[i] = '\0';
+ strcat(Destdir, "/web2c");
+ }
+
+ if(!is_dir(Destdir)) {
+ if(make_dir_p(Destdir)) {
+ fprintf(stderr, "Failed to make a format under %s.\n", Destdir);
+ return (-100);
+ }
+ }
+
+ strcat(Destdir, "/");
+ p = _getcwd(Currdir, BLEN);
+ if(p) {
+ for(p = Currdir; *p ; p++) {
+ if(*p == '\\')
+ *p = '/';
+ else if (IS_KANJI(p))
+ p++;
+ }
+ i = strlen(Currdir);
+ if(Currdir[i-1] == '/') Currdir[i-1] = '\0';
+ strcpy(kpsedot, "KPSE_DOT=.;");
+ strcat(kpsedot, Currdir);
+ _putenv(kpsedot);
+ }
+
+ cdrive = _getdrive();
+ if(tmp[1] == ':') {
+ tdrive = tolower(*tmp) -'a' + 1;
+ _chdrive(tdrive);
+ }
+ _chdir(tmp);
+
+ j = 0;
+
+ if(flag == 4) {
+ char *p, *q;
+ int cont;
+ for(i = 0; i < Fmtnum; i++) {
+ p = K[i].hyphen;
+ cont = 1;
+ while(cont) {
+ for(q = p; *q && *q != ','; q++)
+ ;
+ if(*q == '\0') cont = 0;
+ *q = '\0';
+ q++;
+ if(!stricmp(p, hyphenfile)) {
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ j++;
+ cont = 0;
+ }
+ p = q;
+ }
+ }
+ if(j == 0)
+ fprintf(stderr, "hyphen pattern %s not written in %s.\n",hyphenfile,cnffile);
+ }
+
+ else if(flag == 7) {
+ if(stricmp(byenginename, "metafont") == 0)
+ strcpy(byenginename, "mf-nowin");
+ if(stricmp(byenginename, "metapost") == 0)
+ strcpy(byenginename, "mpost");
+ for(i = 0; i < Fmtnum; i++) {
+ if(!stricmp(K[i].engine, byenginename)) {
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ j++;
+ }
+ }
+ if(j == 0) {
+ fprintf(stderr, "engine name %s not written in %s.\n", byenginename, cnffile);
+ }
+ }
+
+ else if(flag == 3) {
+ for(i = 0; i < Fmtnum; i++) {
+ if(Enginename[0]) {
+ if(!stricmp(Enginename, "metafont"))
+ strcpy(Realenginename, "mf-nowin");
+ else if(!stricmp(Enginename, "metapost"))
+ strcpy(Realenginename, "mpost");
+ else
+ strcpy(Realenginename, Enginename);
+ if(!stricmp(K[i].format, fmtname) &&
+ !stricmp(K[i].engine, Realenginename)) {
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ j++;
+ }
+ }
+ else {
+ if(!stricmp(K[i].format, fmtname)) {
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ j++;
+ }
+ }
+ }
+ if(j == 0) {
+ if(Enginename[0])
+ fprintf(stderr, "format name %s with engine %s not written in %s.\n",
+ fmtname, Realenginename, cnffile);
+ else
+ fprintf(stderr, "format name %s not written in %s.\n", fmtname, cnffile);
+ }
+ }
+
+ else if((flag == 2) || (flag == 6)) {
+ for(i = 0; i < Fmtnum; i++) {
+ strcpy(Buff, Destdir);
+
+ strcpy(enginesubdir, K[i].engine);
+ if(!stricmp(enginesubdir, "mf-nowin"))
+ strcpy(enginesubdir, "metafont");
+ if(!stricmp(enginesubdir, "mf"))
+ strcpy(enginesubdir, "metafont");
+ if(!stricmp(enginesubdir, "mpost"))
+ strcpy(enginesubdir, "metapost");
+ if(stricmp(enginesubdir, "nts"))
+ strcat(Buff, enginesubdir);
+ strcat(Buff, "/");
+
+ strcat(Buff, K[i].format);
+ if(!stricmp(K[i].engine, "nts"))
+ strcat(Buff, ".nfmt");
+ else if(!stricmp(K[i].engine, "mf"))
+ strcat(Buff, ".base");
+ else if(!stricmp(K[i].engine, "mf-nowin"))
+ strcat(Buff, ".base");
+ else if(!stricmp(K[i].engine, "mpost"))
+ strcat(Buff, ".mem");
+ else if(!stricmp(K[i].engine, "pmpost"))
+ strcat(Buff, ".mem");
+ else if(!stricmp(K[i].engine, "upmpost"))
+ strcat(Buff, ".mem");
+ else
+ strcat(Buff, ".fmt");
+ if(flag == 2) {
+ if(_access(Buff, 0) != 0)
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ else if(QQQ == 0)
+ fprintf(stderr, "%s exists.\n", Buff);
+ } else if(flag == 6) {
+ if(_access(Buff, 0) == 0)
+ do_initex(K[i].format, K[i].engine, K[i].args);
+ else if(QQQ == 0)
+ fprintf(stderr, "%s does not exist.\n", Buff);
+ }
+ }
+ }
+
+ else if(flag == 1)
+ do_all();
+
+ _chdrive(cdrive);
+ _chdir(Currdir);
+
+/*
+Check executable files. (ignore "Batch" or "Script" files (case 'x'))
+*/
+ if(Exenum && QQQ == 0) {
+ fprintf(stderr, "\n\nNow I check executable files...\n");
+ fprintf(stderr, "If some executable files do not exist, you must make them\n");
+ fprintf(stderr, "by hard link (Windows NT/2000/XP/Vista/7),"
+ " symbolic link (Vista/7)\n"
+ "or copying (Windows 95/98/Me).\n\n");
+
+ for(i = 0; i < Exenum; i++) {
+ if(testexe(Exefile[i], ".exe"))
+ sprintf(Buff, "OK. %s.exe exists.", Exefile[i]);
+ else if(testexe(Exefile[i], ".bat"))
+ sprintf(Buff, "OK. %s.bat exists.", Exefile[i]);
+ else if(testexe(Exefile[i], ".sh"))
+ sprintf(Buff, "OK. %s.sh exists.", Exefile[i]);
+ else
+ sprintf(Buff, "I cannot find %s.", Exefile[i]);
+ j = strlen(Buff);
+
+ if((i+1) % 2) {
+ for(k = j; k < 36; k++)
+ Buff[k] = ' ';
+ Buff[k] = '\0';
+ fprintf(stderr, "%s", Buff);
+ }
+ else {
+ fprintf(stderr, "%s", Buff);
+ fprintf(stderr, "\n");
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ freeK();
+ if(Errorcnt && QQQ == 0) {
+ fprintf(stderr, "\n\nI could not create %d of format (base/mem) file(s).\n",
+ Errorcnt);
+ fprintf(stderr, "For details, see log file(s) in the (fmt/base/mem) dir(s).\n");
+ }
+ return 0;
+}