beta-0.89.2
[luatex.git] / source / texk / kpathsea / win32 / mktextfm.c
blob34cea032d7b70a4e93845b88908280fb2a32ff45
1 /* mktextfm.c
3 Copyright 2000, 2015 Akira Kakuto.
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this library; if not, see <http://www.gnu.org/licenses/>.
18 Assumes the cx mode in mf.base .
19 Usage: mktextfm [--destdir DESTDIR] name
22 #include <kpathsea/kpathsea.h>
23 #ifndef __MINGW32__
24 #include <web2c/w2c/c-auto.h>
25 #endif
26 #include "mktex.h"
28 #define LBUF 512
29 #define SBUF 512
30 #define TBUF 512
32 char *progname;
34 static void
35 usage (void)
37 fprintf (stderr, "Usage: %s [--destdir destdir] name\n", progname);
38 return;
41 static void
42 version (void)
44 fprintf (stderr, "%s, (C version 1.5 --ak 2009-2012)\n", progname);
45 fprintf (stderr, KPSEVERSION WEB2CVERSION "\n");
46 return;
49 static void
50 help (void)
52 fprintf (stderr, "Usage (1): %s name\n", progname);
53 fprintf (stderr, " tfm is saved following TDS\n");
54 fprintf (stderr, "Usage (2): %s --destdir destdir name\n", progname);
55 fprintf (stderr, " destdir must be an absolute path of dir\n");
56 fprintf (stderr, "Usage (3): %s --version\n", progname);
57 fprintf (stderr, "Usage (4): %s --help\n", progname);
59 return;
62 static void
63 relmem (char **v)
65 int j;
66 for (j = 0; j < 4; j++)
67 free (v[j]);
68 return;
71 int
72 main (int ac, char **av)
74 char rbuff[LBUF];
75 char buff[SBUF];
76 char savebuff[SBUF];
77 char cmd[LBUF];
78 char mffile[TBUF];
79 char *arg[4];
80 static char execfile[SBUF];
82 char kpsedot[SBUF];
83 char currdir[SBUF];
84 char *tmp;
85 int cdrive, tdrive;
87 FILE *fr, *fw, *fnul;
89 int i, savo, savi;
90 char *p, *fp, *fpp;
91 int issetdest;
92 char fontname[SBUF];
94 char texbindir[512];
95 char fullbin[512];
97 kpse_set_program_name (av[0], NULL);
98 progname = kpse_program_name;
101 * get tex binary dir
104 p = kpse_var_value("SELFAUTOLOC");
105 if(p == 0) {
106 fprintf(stderr, "I cannot get SELFAUTOLOC\n");
107 exit(100);
109 strcpy(texbindir, p);
110 free(p);
111 for(p=texbindir; *p; p++) {
112 if(*p == '/') *p = '\\';
114 *p = '\\';
115 *(p+1) = '\0';
117 tmp = getenv ("TEMP");
118 if (!tmp)
119 tmp = getenv ("TMP");
120 if (!tmp)
121 tmp = getenv ("TMPDIR");
122 if (!tmp) {
123 fprintf (stderr, "Please define TEMP | TMP | TMPDIR.\n");
124 return (100);
127 tmp = xstrdup(tmp);
129 for (fpp = tmp; *fpp; fpp++) {
130 if (IS_KANJI(fpp))
131 fpp++;
132 else if (*fpp == '\\')
133 *fpp = '/';
136 issetdest = 0 : TDS
137 issetdest = 1 : user setting
138 issetdest = 2 : current directory
141 issetdest = 0;
143 if (ac < 2) {
144 usage ();
145 free(tmp);
146 return (100);
149 if ((!strcmp (av[1], "--version")) || (!strcmp (av[1], "-version"))) {
150 version ();
151 free(tmp);
152 return (100);
155 if ((!strcmp (av[1], "--help")) || (!strcmp (av[1], "-help"))) {
156 help ();
157 free(tmp);
158 return (100);
161 for (i = 0; i < 4; i++)
162 arg[i] = (char *) malloc (SBUF);
164 if ((!strcmp (av[1], "--destdir")) || (!strcmp (av[1], "-destdir"))) {
165 if (ac != 4) {
166 usage ();
167 relmem (arg);
168 free(tmp);
169 return (100);
171 issetdest = 1;
172 strcpy (buff, av[2]);
173 strcpy (fontname, av[3]);
174 for (p = buff; *p; p++) {
175 if (IS_KANJI(p))
176 p++;
177 else if (*p == '\\')
178 *p = '/';
180 } else {
181 strcpy (fontname, av[1]);
185 /* fontname = font name
187 if ((p = strrchr (fontname, '.')))
188 *p = '\0';
190 /* mffile is METAFONT file name
192 strcpy (mffile, fontname);
193 strcat (mffile, ".mf");
195 if (!(fp = kpse_var_value ("MFINPUTS"))) {
196 fprintf (stderr, "Cannot get value of MFINPUTS\n");
197 relmem (arg);
198 free(tmp);
199 return (100);
202 free (fp);
204 xputenv("MKTEXMF", "1");
205 if (!(p = kpse_find_file (mffile, kpse_mf_format, 1))) {
206 fprintf (stderr, "Cannot find %s.\n", mffile);
207 relmem (arg);
208 free(tmp);
209 return (100);
212 fpp = _getcwd (currdir, SBUF);
213 if (!fpp) {
214 fprintf (stderr, "Failed to get current working directory.\n");
215 relmem (arg);
216 free(tmp);
217 return (100);
219 for (fpp = currdir; *fpp; fpp++) {
220 if (IS_KANJI(fpp))
221 fpp++;
222 else if (*fpp == '\\')
223 *fpp = '/';
226 i = (int)strlen (currdir);
227 if (currdir[i - 1] == '/')
228 currdir[i - 1] = '\0';
229 strcpy (kpsedot, "KPSE_DOT=.;");
230 strcat (kpsedot, currdir);
231 _putenv (kpsedot);
233 if ((p[0] == '.') && (p[1] == '/') && (issetdest != 1)) {
234 issetdest = 2;
235 strcpy (buff, currdir);
238 if (issetdest == 0) {
239 /* now path of ${name}.mf is in p */
240 strcpy (arg[0], "Dummy");
241 strcpy (arg[1], "tfm");
242 strcpy (arg[2], p);
244 if (!(p = getdestdir (3, arg))) {
245 fprintf (stderr, "Cannot get destination directory name.\n");
246 relmem (arg);
247 free(tmp);
248 return (100);
250 strcpy (buff, p);
253 /* Now buff is the destdir */
254 p = buff;
256 i = (int)strlen (p);
258 if (p[i - 1] != '/')
259 strcat (p, "/");
260 strcat (p, fontname);
261 strcat (p, ".tfm");
263 /* now p (or buff) is the full path name of the tfm font */
264 /* check if it exists */
265 if (_access (p, 0) == 0) {
266 fprintf (stderr, "%s exists\n", p);
267 printf ("%s\n", p);
268 relmem (arg);
269 free(tmp);
270 return (0);
273 cdrive = _getdrive ();
274 if (tmp[1] == ':') {
275 tdrive = tolower (*tmp) - 'a' + 1;
276 _chdrive (tdrive);
278 _chdir (tmp);
280 /* save stdout and stdin */
281 savo = _dup (fileno (stdout));
282 savi = _dup (fileno (stdin));
284 /* connect stdout to stderr */
285 _dup2 (fileno (stderr), fileno (stdout));
287 /* connect stdin to nul device */
288 if (!(fnul = fopen ("nul", "r"))) {
289 fprintf (stderr, "Cannot open nul device to read\n");
290 relmem (arg);
291 _chdrive (cdrive);
292 _chdir (currdir);
293 free(tmp);
294 return (100);
296 _dup2 (fileno (fnul), fileno (stdin));
298 /* METAFONT command line */
299 strcpy (cmd, "--progname=mf --base=mf ");
300 strcat (cmd, "\\mode:=ljfour; \\mag:=1; nonstopmode; input ");
301 strcat (cmd, fontname);
302 strcat (cmd, ";");
304 strcpy (execfile, "mf-nowin.exe");
305 fprintf (stderr, "%s %s\n", execfile, cmd);
306 strcpy(fullbin, texbindir);
307 strcat(fullbin, execfile);
308 (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, NULL);
310 /* return to original stdout and stdin */
311 _dup2 (savo, fileno (stdout));
312 close (savo);
313 _dup2 (savi, fileno (stdin));
314 close (savi);
316 /* close nul device */
317 fclose (fnul);
319 /* check consistency */
320 strcpy (cmd, fontname);
321 strcat (cmd, ".600gf");
323 if (_access (cmd, 0) == -1) {
324 fprintf (stderr, "METAFONT failed to make gf font.\n");
325 relmem (arg);
326 _chdrive (cdrive);
327 _chdir (currdir);
328 free(tmp);
329 return (100);
332 remove (cmd);
334 strcpy (cmd, fontname);
335 strcat (cmd, ".tfm");
337 /* copy the tfm file */
338 if (!(fr = fopen (cmd, "rb"))) {
339 fprintf (stderr, "Cannot open %s to read\n", cmd);
340 _chdrive (cdrive);
341 _chdir (currdir);
342 relmem (arg);
343 free(tmp);
344 return (100);
346 if (!(fw = fopen (buff, "wb"))) {
347 fprintf (stderr, "Cannot open %s to write\n", buff);
348 _chdrive (cdrive);
349 _chdir (currdir);
350 relmem (arg);
351 free(tmp);
352 return (100);
355 while ((i = (int)fread (rbuff, 1, LBUF, fr)))
356 fwrite (rbuff, 1, i, fw);
357 fclose (fr);
358 fclose (fw);
360 strcpy(savebuff, buff);
363 copy log file into the current directory
364 in the case that issetdest == 2,
365 because feynmf package requires the
366 log file.
369 if(issetdest == 2) {
370 i = (int)strlen(buff);
371 if(i > 3) {
372 i -= 4;
373 buff[i] = '\0';
374 strcat(buff, ".log");
375 strcpy(cmd, fontname);
376 strcat(cmd, ".log");
377 if (!(fr = fopen (cmd, "rb"))) {
378 fprintf (stderr, "Cannot open %s to read\n", cmd);
379 _chdrive (cdrive);
380 _chdir (currdir);
381 relmem (arg);
382 free(tmp);
383 return (100);
385 if (!(fw = fopen (buff, "wb"))) {
386 fprintf (stderr, "Cannot open %s to write\n", buff);
387 _chdrive (cdrive);
388 _chdir (currdir);
389 relmem (arg);
390 free(tmp);
391 return (100);
393 while ((i = (int)fread (rbuff, 1, LBUF, fr)))
394 fwrite (rbuff, 1, i, fw);
395 fclose (fr);
396 fclose (fw);
400 relmem (arg);
401 if(issetdest != 2)
402 mktexupd (savebuff);
404 /* erase files */
405 strcpy (cmd, fontname);
406 strcat (cmd, ".log");
407 remove (cmd);
409 strcpy (cmd, fontname);
410 strcat (cmd, ".tfm");
411 remove (cmd);
413 _chdrive (cdrive);
414 _chdir (currdir);
416 /* send message to Kpathsea */
417 printf ("%s\n", savebuff);
418 free(tmp);
420 return (0);