/* mktexfmt.c
Copyright 2000, 2017 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 .
*/
/*
kpathsea functions
*/
#include
#define VERSION "0.2"
int main(int ac, char **av)
{
int savo, savi;
FILE *fnul;
char *fmtname;
char *p;
char orgname[256];
char texbindir[256];
char fullbin[256];
int is_w32tex;
kpse_set_program_name(av[0], NULL);
p = kpse_var_value("jtex_filetype");
if (p) {
is_w32tex = 1;
free(p);
} else {
is_w32tex = 0;
}
p = kpse_program_name;
if(ac != 2) {
fprintf(stderr,"%s : Usage %s formatname\n", p, p);
fprintf(stderr,"formatname : (foo.fmt, foo.base, foo.mem)\n");
return 1;
}
if(!strncmp(av[1], "-h", 2) || !strncmp(av[1], "--h", 3)) {
fprintf(stderr,"%s : Usage %s formatname\n", p, p);
fprintf(stderr,"formatname : (foo.fmt, foo.base, foo.mem)\n");
return 0;
}
if(!strncmp(av[1], "-v", 2) || !strncmp(av[1], "--v", 3)) {
fprintf(stderr,"%s : Version %s\n", p, VERSION);
return 0;
}
if(strlen(av[1]) > 127) {
fprintf(stderr, "\nToo long a format name.\n");
return 100;
}
p = kpse_var_value("SELFAUTOLOC");
if(p == 0) {
fprintf(stderr, "I cannot get SELFAUTOLOC\n");
exit(1);
}
strcpy(texbindir, p);
free(p);
for(p=texbindir; *p; p++) {
if(*p == '/') *p = '\\';
}
strcat(texbindir, "\\");
strcpy(orgname, av[1]);
p = strrchr(av[1], '.');
if(!p) {
fprintf(stderr, "formatname needs a suffix.\n");
return 1;
}
if(stricmp(p, ".fmt") && stricmp(p, ".base") && stricmp(p, ".mem")) {
fprintf(stderr, "%s : unknown format type.\n", av[1]);
return 1;
}
*p = '\0';
/* 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");
exit(100);
}
_dup2(fileno(fnul), fileno(stdin));
/* COMMAND */
strcpy(fullbin, texbindir);
if (is_w32tex) {
strcat(fullbin, "fmtutil.exe");
fprintf(stderr, "Running the command %s\n", fullbin);
_spawnlp(_P_WAIT, fullbin, "fmtutil", "--byfmt", av[1], NULL);
} else {
strcat(fullbin, "fmtutil-user.exe");
fprintf(stderr, "Running the command %s\n", fullbin);
_spawnlp(_P_WAIT, fullbin, "fmtutil-user", "--byfmt", av[1], NULL);
}
/* END COMMAND */
/* return to original stdout and stdin */
_dup2(savo, fileno(stdout));
close(savo);
_dup2(savi, fileno(stdin));
close(savi);
/* close nul device */
fclose(fnul);
fmtname = kpse_find_file(orgname , kpse_fmt_format, 0);
if(fmtname) {
printf("%s\n", fmtname);
free(fmtname);
}
return 0;
}