beta-0.89.2
[luatex.git] / source / texk / kpathsea / win32 / mktexpk.c
blobde7d6b456071efafc8de2522865a2b23861db6c3
1 /* mktexpk.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 %%----------------------------------------
19 % Special variables for mktexpk ( W32TeX )
20 % ----------------------------------------
21 % MAKETEXPK_STYLE = dosnames
22 % -----------------------------------------
23 % MAKETEXPK_TOP_DIR = $VARTEXFONTS
24 % -----------------------------------------
25 % MAKETEXPK_MODE = canonex
26 % -----------------------------------------
27 % MAKETEXPK_MODE_300 = cx
28 % MAKETEXPK_MODE_400 = nexthi
29 % MAKETEXPK_MODE_600 = canonex
30 % etc.
31 %%-----------------------------------------
33 Usage: mktexpk [OPTIONS] name,
34 Create a PK font.
36 --dpi DPI use resolution DPI.
37 --bdpi BDPI use base resolution BDPI.
38 --mag MAG use magnificiation MAG.
39 --mfmode MODE use MODE as the METAFONT mode.
40 --destdir DESTDIR write fonts in DESTDIR (absolute path).
42 The following old form is also supported:
43 Usage: mktexmk name dpi bdpi mag [mode]
46 #include <kpathsea/kpathsea.h>
47 #ifndef __MINGW32__
48 #include <web2c/w2c/c-auto.h>
49 #endif
50 #include "mktex.h"
52 #define LLBUF 1024
53 #define LBUF 512
54 #define SBUF 512
55 #define TBUF 512
58 Global variables
61 char *progname;
62 int UseAspectRatio = 0;
63 int FileName = 0;
64 double AspectRatio = 1.0;
66 #define BBUFF_FUL 253
67 #define FFILE_END 254
68 #define LLINE_END 255
70 static int
71 ffgets(char *buf, int size, FILE *fi)
73 char *p;
74 int c;
75 int n;
77 n = 0;
78 p = buf;
79 *p = '\0';
81 while(1) {
82 c = getc(fi);
83 if(c == 26)
84 continue;
85 n++;
86 if(c == EOF) {
87 n++;
88 *p++ = '\n';
89 *p = '\0';
90 return FFILE_END;
92 else if(c == 0x0d || c == 0x0a) {
93 n++;
94 *p++ = '\n';
95 *p = '\0';
96 if(c == 0x0d) {
97 c = getc(fi);
98 if(c != 0x0a)
99 ungetc(c, fi);
101 return LLINE_END;
103 else if(n == (size - 3)) {
104 *p++ = c; *p = '\0';
105 return BBUFF_FUL;
107 else *p++ = c;
111 static int
112 isskip(char c)
114 if((c == ' ') || (c == '\t'))
115 return 1;
116 else if((c == '<') || (c == '[')) {
117 FileName = 1;
118 return 1;
120 else
121 return 0;
124 static void
125 skipchar(char **p)
127 while(isskip(**p))
128 (*p)++;
131 static void
132 version (void)
134 fprintf (stderr, "%s, (C version 1.5 --ak 2006-2012)\n", progname);
135 fprintf (stderr, KPSEVERSION WEB2CVERSION "\n");
138 static void
139 usage (void)
141 fprintf (stderr, "Usage: %s [OPTIONS] NAME,\n\
142 Create a PK font.\n\n\
143 --dpi DPI use resolution DPI.\n\
144 --bdpi BDPI use base resolution BDPI.\n\
145 --mag MAG use magnificiation MAG.\n\
146 --mfmode MODE use MODE as the METAFONT mode.\n\
147 --destdir DESTDIR write fonts in DESTDIR.\n", progname);
150 static void
151 help (void)
153 fprintf (stderr, "Usage: %s [OPTIONS] NAME,\n\
154 Create a PK font.\n\n\
155 --dpi DPI use resolution DPI.\n\
156 --bdpi BDPI use base resolution BDPI.\n\
157 --mag MAG use magnificiation MAG.\n\
158 --mfmode MODE use MODE as the METAFONT mode.\n\
159 --destdir DESTDIR write fonts in DESTDIR.\n\n\
160 Try to create a PK file for NAME at resolution DPI, with an assumed\n\
161 device base resolution of BDPI, and a Metafont `mag' of MAG. Use MODE\n\
162 for the METAFONT mode. Use DESTDIR for the root of where to install\n\
163 into. DESTDIR must be an absolute directory name. If DESTDIR is not given,\n\
164 suitable directory is determined according to the TDS.\n\n\
165 Old form:\n\
166 Usage: %s name dpi bdpi mag [mode]\n\
167 is also supported.", progname, progname);
171 static void
172 tpkerr (const char *s)
174 fprintf (stderr, "%s\n", s);
178 static void
179 relmem (char **v)
181 int j;
182 for (j = 0; j < 4; j++)
183 free (v[j]);
184 return;
187 static void
188 get_designsize(char *tfname, char *dsiz)
190 FILE *f;
191 unsigned char a, b, c, d;
192 unsigned int n;
193 double x;
194 char *p;
196 strcpy(dsiz, "10.0"); /* default */
198 p = kpse_find_file (tfname, kpse_tfm_format, 0);
199 if(p) {
200 f = fopen(p, "rb");
201 free(p);
202 if(f) {
203 fseek(f, 28, SEEK_SET);
204 a = getc(f);
205 b = getc(f);
206 c = getc(f);
207 d = getc(f);
208 fclose(f);
209 n = (a << 24) + (b << 16) + (c << 8) + d;
210 x = n / 1048576.0;
211 sprintf(dsiz, "%.1lf", x);
217 main (int ac, char **av)
219 static char execfile[SBUF];
220 char rbuff[LBUF];
221 char buff[LBUF];
222 char cmd[LBUF];
223 char mfname[TBUF];
224 char tfname[TBUF];
225 char pkname[TBUF];
227 char name[TBUF];
228 char dpi[TBUF];
229 char ydpi[TBUF];
230 char bdpi[TBUF];
231 char mag[TBUF];
232 char mode[TBUF];
233 char destdir[SBUF];
234 char designsize[64];
236 char *arg[4];
238 char currdir[SBUF];
239 char kpsedot[SBUF];
240 char *tmp;
241 int cdrive, tdrive;
243 FILE *fr, *fw, *fnul, *tfmfileptr;
245 int i, savo, savi, ret;
246 int style;
247 int issetdest;
248 int app;
249 int oldform;
250 int ps2pkok;
251 char *env;
252 char *p, *fpp;
254 double Xdpi, Ydpi;
256 char texname[TBUF], pfbname[TBUF], slant[TBUF], extend[TBUF], encname[TBUF];
258 char texbindir[256];
259 char fullbin[512];
262 * style = 0 : MAKETEXPK_STYLE undefined or other than dosnames
263 * style = 1 : MAKETEXPK_STYLE = dosnames
267 * issetdest = 0 : no destdir
268 * issetdest = 1 : destdir
269 * issetdest = 2 : current working dir
273 * app = 0 : mf
274 * app = 1 : ps2pk
275 * app = 2 : gsftopk
276 * app = 3 : ttf2pk
277 * app = 4 : hbf2gf
281 * oldform = 0 : newform of the command line
282 * oldform = 1 : oldform of the command line
286 * TEMP | TMP | TMPDIR (necessary)
290 tmp = getenv ("TEMP");
291 if (!tmp)
292 tmp = getenv ("TMP");
293 if (!tmp)
294 tmp = getenv ("TMPDIR");
295 if (!tmp) {
296 tpkerr ("Please define TEMP | TMP | TMPDIR.");
297 return (100);
299 tmp = xstrdup(tmp);
302 * normalize directory separators
304 normalize (tmp);
306 for (i = 0; i < 4; i++)
307 arg[i] = (char *) malloc (SBUF);
309 kpse_set_program_name (av[0], NULL);
310 progname = kpse_program_name;
313 * get tex binary dir
316 p = kpse_var_value("SELFAUTOLOC");
317 if(p == 0) {
318 fprintf(stderr, "I cannot get SELFAUTOLOC\n");
319 exit(100);
321 strcpy(texbindir, p);
322 free(p);
323 for(p=texbindir; *p; p++) {
324 if(*p == '/') *p = '\\';
326 *p = '\\';
327 *(p+1) = '\0';
329 if (ac < 2) {
330 usage ();
331 relmem (arg);
332 free(tmp);
333 return (100);
336 issetdest = 0;
337 ps2pkok = 0;
340 * oldform or newform ?
344 if (av[1][0] == '-')
345 oldform = 0;
346 else
347 oldform = 1;
351 * Old form of the command line
354 if (oldform == 1) {
355 if (ac < 5) {
356 usage ();
357 relmem (arg);
358 free(tmp);
359 return (100);
361 if((strlen(av[1]) > TBUF -1 ) ||
362 (strlen(av[2]) > TBUF -1 ) ||
363 (strlen(av[3]) > TBUF -1 ) ||
364 (strlen(av[4]) > TBUF -1 )) {
365 fprintf(stderr, "\nToo long a string.\n");
366 free(tmp);
367 return 100;
370 strcpy (name, av[1]);
371 strcpy (dpi, av[2]);
372 strcpy (bdpi, av[3]);
373 strcpy (mag, av[4]);
374 if (ac > 5) {
375 if(strlen(av[5]) > TBUF -1) {
376 fprintf(stderr, "\nToo long a string.\n");
377 free(tmp);
378 return 100;
380 strcpy (mode, av[5]);
382 else
383 mode[0] = '\0';
384 } else {
386 * New form of the command line
388 name[0] = dpi[0] = bdpi[0] = mag[0] = mode[0] = destdir[0] = '\0';
389 i = 1;
390 while (i < ac) {
391 if(strlen(av[i]) > TBUF - 1) {
392 fprintf(stderr, "\nToo long a string.\n");
393 free(tmp);
394 return 100;
396 if (av[i][0] != '-') {
397 strcpy (name, av[i]);
398 break;
400 if (!strcmp (av[i], "--dpi") || !strcmp (av[i], "-dpi")) {
401 i++;
402 if (i >= ac) {
403 tpkerr ("Invalid arguments.");
404 relmem (arg);
405 free(tmp);
406 return (100);
408 strcpy (dpi, av[i]);
409 i++;
410 } else if (!strcmp (av[i], "--bdpi") || !strcmp (av[i], "-bdpi")) {
411 i++;
412 if (i >= ac) {
413 tpkerr ("Invalid arguments.");
414 relmem (arg);
415 free(tmp);
416 return (100);
418 strcpy (bdpi, av[i]);
419 i++;
420 } else if (!strcmp (av[i], "--mag") || !strcmp (av[i], "-mag")) {
421 i++;
422 if (i >= ac) {
423 tpkerr ("Invalid arguments.");
424 relmem (arg);
425 free(tmp);
426 return (100);
428 strcpy (mag, av[i]);
429 i++;
430 } else if (!strcmp (av[i], "--mfmode") || !strcmp (av[i], "-mfmode")) {
431 i++;
432 if (i >= ac) {
433 tpkerr ("Invalid arguments.");
434 relmem (arg);
435 free(tmp);
436 return (100);
438 strcpy (mode, av[i]);
439 i++;
440 } else if (!strcmp (av[i], "--destdir") || !strcmp (av[i], "-destdir")) {
441 i++;
442 if (i >= ac) {
443 tpkerr ("Invalid arguments.");
444 relmem (arg);
445 free(tmp);
446 return (100);
448 strcpy (destdir, av[i]);
449 issetdest = 1;
450 i++;
451 } else if (!strcmp (av[i], "--version") || !strcmp (av[i], "-version")) {
452 version ();
453 relmem (arg);
454 free(tmp);
455 return (0);
456 } else if (!strcmp (av[i], "--help") || !strcmp (av[i], "-help")) {
457 help ();
458 relmem (arg);
459 free(tmp);
460 return (0);
461 } else {
462 tpkerr ("Argument error.");
463 relmem (arg);
464 free(tmp);
465 return (100);
468 } /* End of command line analysis */
470 env = kpse_var_value ("MAKETEXPK_STYLE");
472 if ((env == NULL) || !(*env) || (env && strcmp (env, "dosnames"))) {
473 style = 0;
474 } else
475 style = 1;
478 * Default program is mf
481 app = 0;
484 * check if mfmode and bdpi are consistent or not
487 if (bdpi[0] && mode[0] && mode[0] != '/') {
488 FILE *frd;
489 char buff[128];
490 int len;
492 strcpy (fullbin, texbindir);
493 strcat (fullbin, "mf-nowin.exe \"\\mode:=");
494 strcat (fullbin, mode);
495 strcat (fullbin, ";mode_setup;message");
496 strcat (fullbin, "(decimal round pixels_per_inch);");
497 strcat (fullbin, "end. <nul\"");
499 frd = popen (fullbin, "r");
500 if (!frd) {
501 tpkerr ("I cannot find METAFONT.\n");
502 relmem (arg);
503 free(tmp);
504 return (100);
506 (void) fgets (buff, 126, frd);
507 (void) fgets (buff, 126, frd);
508 pclose (frd);
509 system("del /Q mfput.*");
511 len = (int)strlen (buff);
512 if (buff[len - 1] == '\n') {
513 buff[len - 1] = '\0';
514 if (buff[len - 2] == '\r')
515 buff[len - 2] = '\0';
517 if (strcmp (bdpi, buff)) {
518 fprintf(stderr, "mode_dpi %s and bdpi %s are inconsistent.\n", buff, bdpi);
519 fprintf(stderr, "therefore I reset mfmode.\n");
520 mode[0] = '\0';
525 * determine mfmode if not given
528 if (mode[0] == 0 || mode[0] == '/') {
529 if (bdpi[0] == 0) {
530 tpkerr ("Cannot determine the mode.");
531 tpkerr ("I will try other possibilities.");
532 app = 1;
533 } else {
534 strcpy (rbuff, "MAKETEXPK_MODE_");
535 strcat (rbuff, bdpi);
536 if ((env = kpse_var_value ("MAKETEXPK_MODE")) && *env)
537 strcpy (mode, env);
538 else if ((env = kpse_var_value (rbuff)))
539 strcpy (mode, env);
540 else if (!strcmp (bdpi, "85"))
541 strcpy (mode, "sun");
542 else if (!strcmp (bdpi, "100"))
543 strcpy (mode, "nextscrn");
544 else if (!strcmp (bdpi, "118"))
545 strcpy (mode, "pcprevw");
546 else if (!strcmp (bdpi, "160"))
547 strcpy (mode, "nectzo");
548 else if (!strcmp (bdpi, "180"))
549 strcpy (mode, "toshiba");
550 else if (!strcmp (bdpi, "200"))
551 strcpy (mode, "highfax");
552 else if (!strcmp (bdpi, "240"))
553 strcpy (mode, "canonlbp");
554 else if (!strcmp (bdpi, "300"))
555 strcpy (mode, "cx");
556 else if (!strcmp (bdpi, "320"))
557 strcpy (mode, "neclm");
558 else if (!strcmp (bdpi, "360"))
559 strcpy (mode, "epstylus");
560 else if (!strcmp (bdpi, "400"))
561 strcpy (mode, "nexthi");
562 else if (!strcmp (bdpi, "600"))
563 strcpy (mode, "ljfour");
564 else if (!strcmp (bdpi, "720"))
565 strcpy (mode, "epscszz");
566 else if (!strcmp (bdpi, "800"))
567 strcpy (mode, "lwpro");
568 else if (!strcmp (bdpi, "1000"))
569 strcpy (mode, "lmaster");
570 else if (!strcmp (bdpi, "1200"))
571 strcpy (mode, "ultre");
572 else if (!strcmp (bdpi, "1270"))
573 strcpy (mode, "linoone");
574 else if (!strcmp (bdpi, "1800"))
575 strcpy (mode, "vtftzz");
576 else if (!strcmp (bdpi, "2400"))
577 strcpy (mode, "supre");
578 else if (!strcmp (bdpi, "2540"))
579 strcpy (mode, "linotzzh");
580 else if (!strcmp (bdpi, "3386"))
581 strcpy (mode, "linolttz");
582 else if (!strcmp (bdpi, "8000"))
583 strcpy (mode, "dpdfezzz");
584 else if (!strcmp (bdpi, "9600"))
585 strcpy (mode, "ibx");
586 else {
587 tpkerr ("Cannot determine the mode.");
588 tpkerr ("I will try other possibilities.");
589 app = 1;
594 if (env) free (env);
596 if (name[0] == 0) {
597 tpkerr ("Font name is not given.");
598 relmem (arg);
599 free(tmp);
600 return (100);
603 if ((p = strrchr (name, '.')))
604 *p = '\0';
606 strcpy (mfname, name);
607 strcat (mfname, ".mf");
609 if (app == 0) {
610 if (!(p = kpse_var_value ("MFINPUTS"))) {
611 tpkerr ("Cannot get value of MFINPUTS.");
612 relmem (arg);
613 free(tmp);
614 return (100);
616 free (p);
617 xputenv("MKTEXMF", "1");
618 if (!(p = kpse_find_file (mfname, kpse_mf_format, 1))) {
619 fprintf (stderr, "Cannot find %s .\n", mfname);
620 tpkerr ("I try ps2pk --> gsftopk --> ttf2pk --> hbf2gf.");
621 app = 1;
625 if (app != 0) {
626 strcpy (mode, "modeless");
627 strcpy (tfname, name);
628 strcat (tfname, ".tfm");
629 if (!(p = kpse_var_value ("TFMFONTS"))) {
630 tpkerr ("Cannot get value of TFMFONTS.");
631 relmem (arg);
632 free(tmp);
633 return (100);
635 free (p);
637 I don't try to create nonexisting tfm here.
639 if (!(p = kpse_find_file (tfname, kpse_tfm_format, 0))) {
640 fprintf (stderr, "Cannot find %s .\n", tfname);
641 relmem (arg);
642 free(tmp);
643 return 100;
645 tfmfileptr = fopen (p, "rb");
646 if (!tfmfileptr) {
647 fprintf (stderr, "I cannot open %s.\n", p);
648 relmem (arg);
649 free(tmp);
650 return 100;
652 i = 256 * getc (tfmfileptr);
653 i += getc (tfmfileptr);
654 fclose (tfmfileptr);
655 if ((i == 9) || (i == 11)) {
656 fprintf (stderr, "Current font seems to be a Japanese one.\n");
657 fprintf (stderr, "I give up to create a PK font.\n");
658 relmem (arg);
659 free(tmp);
660 return 100;
664 if ((p[0] == '.') && (p[1] == '/') && (issetdest != 1))
665 issetdest = 2;
667 fpp = _getcwd (currdir, SBUF);
668 if (!fpp) {
669 fprintf (stderr, "Failed to get current working directory.\n");
670 relmem (arg);
671 free(tmp);
672 return (100);
674 normalize (currdir);
676 i = (int)strlen (currdir);
677 if (currdir[i - 1] == '/')
678 currdir[i - 1] = '\0';
680 strcpy (kpsedot, "KPSE_DOT=.;");
681 strcat (kpsedot, currdir);
682 _putenv (kpsedot);
684 if (issetdest == 2) {
685 strcpy (destdir, currdir);
688 if (issetdest == 0) {
689 strcpy (arg[0], "Dummy");
690 strcpy (arg[1], "pk");
691 strcpy (arg[2], p);
692 strcpy (arg[3], mode);
694 if (!(p = getdestdir (4, arg))) {
695 tpkerr ("Cannot get destination directory name.");
696 relmem (arg);
697 free(tmp);
698 return (100);
700 strcpy (rbuff, p);
701 } else
702 strcpy (rbuff, destdir);
705 * Change backslash into slash
707 normalize (rbuff);
709 p = rbuff;
710 i = (int)strlen (p);
711 if (p[i - 1] == '/')
712 p[i - 1] = '\0';
714 if (issetdest) {
715 if (!is_dir (p)) {
716 fprintf (stderr, "Destination %s is not found.\n", p);
717 relmem (arg);
718 free(tmp);
719 return (100);
721 } else if (!is_dir (p)) {
722 if (make_dir (p)) {
723 tpkerr ("Error in make_dir.");
724 relmem (arg);
725 free(tmp);
726 return (100);
730 strcpy (buff, p);
731 p = buff;
733 i = (int)strlen (p);
735 if (p[i - 1] != '/')
736 strcat (p, "/");
738 if (dpi[0] == 0) {
739 tpkerr ("Cannot determine DPI.");
740 relmem (arg);
741 free(tmp);
742 return (100);
745 if (style == 1 && issetdest != 2) { /* dosnames */
746 strcat (p, "dpi");
747 strcat (p, dpi);
748 if (!is_dir (p)) {
749 if (make_dir (p)) {
750 tpkerr ("Error in make_dir.");
751 relmem (arg);
752 free(tmp);
753 return (100);
756 strcat (p, "/");
759 strcat (p, name);
760 strcat (p, ".");
762 if (style != 1 || issetdest == 2)
763 strcat (p, dpi); /* long suffix */
764 strcat (p, "pk");
766 /* Now buff and p is the full path name of pk file */
767 /* check the existence of pk file */
769 if (_access (p, 0) == 0) {
770 fprintf (stderr, "%s exists.\n", p);
771 relmem (arg);
772 printf ("%s\n", p);
773 free(tmp);
774 return (0);
778 * Go to the temporary directory
781 cdrive = _getdrive ();
782 if (tmp[1] == ':') {
783 tdrive = tolower (*tmp) - 'a' + 1;
784 _chdrive (tdrive);
786 _chdir (tmp);
789 * save stdout and stdin
791 savo = _dup (fileno (stdout));
792 savi = _dup (fileno (stdin));
795 * connect stdout to stderr
797 _dup2 (fileno (stderr), fileno (stdout));
800 * connect stdin to nul
802 if (!(fnul = fopen ("nul", "rb"))) {
803 fprintf (stderr, "Cannot open nul device to read.\n");
804 _chdrive (cdrive);
805 _chdir (currdir);
806 relmem (arg);
807 free(tmp);
808 return (100);
810 _dup2 (fileno (fnul), fileno (stdin));
813 * pkname is the filename of PK font
815 sprintf (pkname, "%s.%spk", name, dpi);
817 if (app == 0) {
819 * METAFONT command line
821 if (mag[0] == 0) {
822 tpkerr ("Cannot determine MAG.");
823 _chdrive (cdrive);
824 _chdir (currdir);
825 relmem (arg);
826 free(tmp);
827 return (100);
829 sprintf (cmd,
830 "--progname=mf --base=mf \\mode:=%s; \\mag:=%s; nonstopmode; input %s;",
831 mode, mag, name);
833 strcpy (execfile, "mf-nowin.exe");
834 fprintf (stderr, "%s %s\n", execfile, cmd);
835 strcpy(fullbin, texbindir);
836 strcat(fullbin, execfile);
837 (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, NULL);
839 sprintf (cmd, "%s.%sgf", name, dpi);
842 * check the consistency
844 if (_access (cmd, 0) != 0) {
845 tpkerr ("Failed to make gf font by METAFONT.");
846 _chdrive (cdrive);
847 _chdir (currdir);
848 relmem (arg);
849 free(tmp);
850 return (100);
854 * Change gf into pk
856 strcpy (execfile, "gftopk.exe");
857 fprintf (stderr, "%s %s %s\n", execfile, cmd, pkname);
858 strcpy(fullbin, texbindir);
859 strcat(fullbin, execfile);
860 (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, pkname, NULL);
862 if (_access (pkname, 0) != 0) {
863 tpkerr ("Failed to make pk from gf.");
864 _chdrive (cdrive);
865 _chdir (currdir);
866 relmem (arg);
867 free(tmp);
868 return (100);
872 * erase gf file
874 remove (cmd);
877 * erase log file
879 sprintf (cmd, "%s.log", name);
880 remove (cmd);
882 * erase tfm file
884 sprintf (cmd, "%s.tfm", name);
885 remove (cmd);
887 goto finale;
891 * app = 1 : ps2pk --> gsftopk --> ttf2pk --> hbf2gf
894 p = kpse_find_file ("pspksupp.map", kpse_fontmap_format, 0);
895 if(p) {
896 fr = fopen (p, "r"); /* Read pspksupp.map */
897 free (p);
899 if (!fr) {
900 tpkerr ("Cannot open pspksupp.map to read.");
901 ps2pkok = 0;
902 goto do_ps2pk;
905 while (fgets (rbuff, SBUF, fr)) {
906 if (rbuff[0] == '%' || rbuff[0] == '#' || rbuff[0] == '\n')
907 continue;
908 texname[0] = pfbname[0] = slant[0] = extend[0] = encname[0] = '\0';
909 i = sscanf (rbuff, "%s %s %s %s %s", texname, pfbname, slant, extend,
910 encname);
911 if (i == 2 && !strncmp (texname, "AspectRatio", 11)) {
912 if (!sscanf (pfbname, "%lf", &AspectRatio)) {
913 tpkerr ("File format of pspksupp.map is wrong.");
914 fclose (fr);
915 ps2pkok = 0;
916 goto do_ps2pk;
918 UseAspectRatio = 1;
919 continue;
920 } else if (i > 0 && !stricmp (texname, name)) {
921 p = kpse_var_value ("T1FONTS");
922 if (!p) {
923 tpkerr ("T1FONTS is not defined.");
924 ps2pkok = 0;
925 break;
927 free (p);
928 p = kpse_find_file (pfbname, kpse_type1_format, 0);
929 if (!p) {
930 fprintf (stderr, "%s is not found.\n", pfbname);
931 ps2pkok = 0;
932 break;
934 free (p);
935 ps2pkok = 1;
936 if(bdpi[0] == 0)
937 i--;
938 break;
941 fclose (fr);
942 goto do_ps2pk;
943 } else {
944 char *q;
945 char a[SBUF];
946 char b[SBUF];
947 char psname[SBUF];
948 char pscommand[SBUF];
949 double slantval, extendval;
951 texname[0] = pfbname[0] = encname[0] = '\0';
952 a[0] = b[0] = psname[0] = pscommand[0] = '\0';
953 FileName = 0;
954 strcpy(slant, "0");
955 strcpy(extend, "1");
957 ps2pkok = 0;
959 p = kpse_find_file ("ps2pk.map", kpse_fontmap_format, 0);
960 if(!p) {
961 tpkerr("Necessary map file for ps2pk is not found.");
962 goto do_ps2pk;
964 fr = fopen(p,"rb");
965 free(p);
966 if (!fr) {
967 tpkerr ("Cannot open ps2pk.map to read.");
968 goto do_ps2pk;
970 while ((ret=ffgets (rbuff, LBUF, fr)) != FFILE_END) {
971 if(ret == BBUFF_FUL) {
972 fprintf(stderr, "A line in ps2pk.map seems to be too long.\n");
973 fprintf(stderr, "I try to continue. But something may be wrong.\n");
975 p = rbuff;
976 skipchar(&p);
977 if((*p == '%') || (*p == '#') || (*p == '\n'))
978 continue;
979 q = texname;
980 while(!isskip(*p) && (*p != '\n'))
981 *q++ = *p++;
982 *q = '\0';
983 if(stricmp(texname, name))
984 continue;
985 skipchar(&p);
986 if((*p == '%') || (*p == '#') || (*p == '\n')) {
987 fprintf(stderr, "Incorrect line in \"ps2pk.map\".\n");
988 break;
990 if(FileName)
991 q = a;
992 else
993 q = psname;
994 while(!isskip(*p) && (*p != '\n'))
995 *q++ = *p++;
996 *q = '\0';
997 skipchar(&p);
999 skip flag
1001 if(!FileName) {
1002 while(isdigit(*p))
1003 p++;
1004 skipchar(&p);
1006 if((*p == '%') || (*p == '#') || (*p == '\n')) {
1007 tpkerr("I cannot use ps2pk due to lack of data.");
1008 break;
1010 if(*p == '\"') {
1011 q = pscommand;
1012 *q++ = *p++;
1013 while(*p != '\"')
1014 *q++ = *p++;
1015 *q++ = *p++;
1016 *q = '\0';
1017 skipchar(&p);
1018 if((*p == '%') || (*p == '#') || (*p == '\n'))
1019 break;
1021 if(FileName && a[0] == '\0')
1022 q = a;
1023 else if(FileName && b[0] == '\0')
1024 q = b;
1025 else {
1026 tpkerr("Incorrect line in ps2pk.map.");
1027 break;
1029 while(!isskip(*p) && (*p != '\n'))
1030 *q++ = *p++;
1031 *q = '\0';
1032 skipchar(&p);
1033 if((*p == '%') || (*p == '#') || (*p == '\n'))
1034 break;
1035 if(*p == '\"') {
1036 q = pscommand;
1037 *q++ = *p++;
1038 while(*p != '\"')
1039 *q++ = *p++;
1040 *q++ = *p++;
1041 *q = '\0';
1042 skipchar(&p);
1043 if((*p == '%') || (*p == '#') || (*p == '\n'))
1044 break;
1046 if (FileName && a[0] == '\0')
1047 q = a;
1048 else if (FileName && b[0] == '\0')
1049 q = b;
1050 else {
1051 fprintf(stderr, "Incorrect line in \"ps2pk.map\".\n");
1052 break;
1054 while(!isskip(*p) && (*p != '\n'))
1055 *q++ = *p++;
1056 *q = '\0';
1057 skipchar(&p);
1058 if((*p == '%') || (*p == '#') || (*p == '\n'))
1059 break;
1060 if(*p == '\"') {
1061 q = pscommand;
1062 *q++ = *p++;
1063 while(*p != '\"')
1064 *q++ = *p++;
1065 *q++ = *p++;
1066 *q = '\0';
1067 skipchar(&p);
1068 if((*p == '%') || (*p == '#') || (*p == '\n'))
1069 break;
1071 skipchar(&p);
1072 if((*p == '%') || (*p == '#') || (*p == '\n'))
1073 break;
1074 else {
1075 fprintf(stderr, "Incorrect line in \"ps2pk.map\".\n");
1076 break;
1079 fclose(fr);
1081 if(pscommand[0]) {
1082 p = strstr(pscommand, "SlantFont");
1083 if(p) {
1084 p--;
1085 while(*p == ' ' || *p == '\t') p--;
1086 while(*p != ' ' && *p != '\t' && *p != '\"') p--;
1087 p++;
1088 sscanf(p, "%lf SlantFont", &slantval);
1089 sprintf(slant, "%lf", slantval);
1090 p = slant + strlen(slant) - 1;
1091 while(*p == '0') {
1092 *p = '\0';
1093 p--;
1096 p = strstr(pscommand, "ExtendFont");
1097 if(p) {
1098 p--;
1099 while(*p == ' ' || *p == '\t') p--;
1100 while(*p != ' ' && *p != '\t' && *p != '\"') p--;
1101 p++;
1102 sscanf(p, "%lf ExtendFont", &extendval);
1103 sprintf(extend, "%lf", extendval);
1104 p = extend + strlen(extend) - 1;
1105 while(*p == '0') {
1106 *p = '\0';
1107 p--;
1111 if(a[0]) {
1112 p = strrchr(a, '.');
1113 if(p && !stricmp(p, ".enc")) {
1114 *p = '\0';
1115 strcpy(encname, a);
1117 else if(p && !stricmp(p, ".pfb")) {
1118 *p = '\0';
1119 strcpy(pfbname, a);
1122 if(b[0]) {
1123 p = strrchr(b, '.');
1124 if(p && !stricmp(p, ".enc")) {
1125 *p = '\0';
1126 strcpy(encname, b);
1128 else if(p && !stricmp(p, ".pfb")) {
1129 *p = '\0';
1130 strcpy(pfbname, b);
1133 if(pfbname[0] == '\0')
1134 goto do_ps2pk;
1135 p = kpse_find_file (pfbname, kpse_type1_format, 0);
1136 if(!p)
1137 goto do_ps2pk;
1138 free(p);
1139 ps2pkok = 1;
1140 if(encname[0] && bdpi[0]) {
1141 i = 5;
1142 } else if(!encname[0] && !bdpi[0]) {
1143 i = 3;
1144 } else {
1145 i = 4;
1149 do_ps2pk:
1151 if (ps2pkok) {
1152 if (UseAspectRatio) {
1153 sscanf (dpi, "%lf", &Xdpi);
1154 Ydpi = Xdpi * AspectRatio;
1155 sprintf (ydpi, "%d", (int) Ydpi);
1156 } else
1157 strcpy (ydpi, dpi);
1159 strcpy(tfname, name);
1160 strcat(tfname, ".tfm");
1161 get_designsize(tfname, designsize);
1163 if (i == 3) {
1164 sprintf (cmd, "-X%s -Y%s -S%s -E%s -P%s %s %s",
1165 dpi, ydpi, slant, extend, designsize, pfbname, pkname);
1166 } else if (i == 4 && bdpi[0]) {
1167 sprintf (cmd, "-X%s -Y%s -R%s -S%s -E%s -P%s %s %s",
1168 dpi, ydpi, bdpi, slant, extend, designsize, pfbname, pkname);
1169 } else if (i == 4 && encname[0]) {
1170 sprintf (cmd, "-e%s -X%s -Y%s -S%s -E%s -P%s %s %s",
1171 encname, dpi, ydpi, slant, extend, designsize, pfbname, pkname);
1172 } else if (i == 5) {
1173 sprintf (cmd, "-e%s -X%s -Y%s -R%s -S%s -E%s -P%s %s %s",
1174 encname, dpi, ydpi, bdpi, slant, extend, designsize, pfbname, pkname);
1175 } else {
1176 tpkerr ("File format of pspksupp.map is wrong.");
1177 goto do_gsftopk;
1180 strcpy (execfile, "ps2pk.exe");
1181 fprintf (stderr, "%s %s\n", execfile, cmd);
1182 strcpy(fullbin, texbindir);
1183 strcat(fullbin, execfile);
1184 (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, NULL);
1186 if (_access (pkname, 0) != 0) {
1187 tpkerr ("ps2pk failed to make pk font.");
1188 goto do_gsftopk;
1190 goto finale;
1194 * ps2pk is impossible to use
1197 do_gsftopk:
1199 tpkerr ("ps2pk cannot be used.");
1200 tpkerr ("I try gsftopk.");
1201 app = 2;
1203 strcpy (execfile, "gsftopk.exe");
1204 fprintf (stderr, "%s %s %s\n", execfile, name, dpi);
1205 strcpy(fullbin, texbindir);
1206 strcat(fullbin, execfile);
1207 (void) _spawnlp (_P_WAIT, fullbin, execfile, name, dpi, NULL);
1209 if (_access (pkname, 0) != 0) {
1210 tpkerr ("gsftopk cannot be used.");
1211 tpkerr ("Next I try ttf2pk.");
1212 app = 3;
1213 strcpy (execfile, "ttf2pk.exe");
1214 fprintf (stderr, "%s -q %s %s\n", execfile, name, dpi);
1215 strcpy(fullbin, texbindir);
1216 strcat(fullbin, execfile);
1217 (void) _spawnlp (_P_WAIT, fullbin, execfile, "-q", name, dpi, NULL);
1219 if (_access (pkname, 0) != 0) {
1220 tpkerr ("ttf2pk failed.");
1221 tpkerr ("Finally I try hbf2gf.");
1222 app = 4;
1223 strcpy (execfile, "hbf2gf.exe");
1224 fprintf (stderr, "%s -q -p %s %s\n", execfile, name, dpi);
1225 strcpy(fullbin, texbindir);
1226 strcat(fullbin, execfile);
1227 (void) _spawnlp (_P_WAIT, fullbin, execfile, "-q -p", name, dpi, NULL);
1229 sprintf (cmd, "%s.%sgf", name, dpi);
1230 if (_access (cmd, 0) != 0) {
1231 tpkerr ("All trials failed.");
1232 _chdrive (cdrive);
1233 _chdir (currdir);
1234 relmem (arg);
1235 free(tmp);
1236 return (100);
1238 strcpy (execfile, "gftopk.exe");
1239 fprintf (stderr, "%s %s %s\n", execfile, cmd, pkname);
1240 strcpy(fullbin, texbindir);
1241 strcat(fullbin, execfile);
1242 (void) _spawnlp (_P_WAIT, fullbin, execfile, cmd, pkname, NULL);
1244 if (_access (pkname, 0) != 0) {
1245 tpkerr ("All trials failed.");
1246 _chdrive (cdrive);
1247 _chdir (currdir);
1248 relmem (arg);
1249 free(tmp);
1250 return (100);
1252 remove (cmd);
1256 finale:
1259 * return to original stdout and stdin
1261 _dup2 (savo, fileno (stdout));
1262 close (savo);
1263 _dup2 (savi, fileno (stdin));
1264 close (savi);
1267 * close nul device
1269 fclose (fnul);
1272 * copy the pk file
1274 if (!(fr = fopen (pkname, "rb"))) {
1275 fprintf (stderr, "Cannot open %s to read.\n", pkname);
1276 _chdrive (cdrive);
1277 _chdir (currdir);
1278 relmem (arg);
1279 free(tmp);
1280 return (100);
1283 if (!(fw = fopen (buff, "wb"))) {
1284 fprintf (stderr, "Cannot open %s to write.\n", buff);
1285 _chdrive (cdrive);
1286 _chdir (currdir);
1287 relmem (arg);
1288 free(tmp);
1289 return (100);
1292 while ((i = (int)fread (rbuff, 1, LBUF, fr)))
1293 fwrite (rbuff, 1, i, fw);
1295 fclose (fr);
1296 fclose (fw);
1297 remove (pkname);
1299 relmem (arg);
1302 * update ls-R if it exists
1304 mktexupd (buff);
1307 * tell kpathsea
1310 printf ("%s\n", buff);
1311 _chdrive (cdrive);
1312 _chdir (currdir);
1313 free(tmp);
1315 return (0);