trfn: handle .isol for isolated arabic characters
[neatmkfn.git] / mktrfn.c
blob348153f40b3b7accc32fe82c1e9a87561dead5e5
1 /*
2 * mktrfn - produce troff font descriptions
4 * Copyright (C) 2012-2013 Ali Gholami Rudi <ali at rudi dot ir>
6 * This program is released under the Modified BSD license.
7 */
8 #include <ctype.h>
9 #include <fcntl.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include "trfn.h"
16 #define TOKLEN 256
18 static void otfdump_read(void)
20 char cmd[TOKLEN];
21 char name[TOKLEN];
22 char ch[TOKLEN];
23 char c1[TOKLEN], c2[TOKLEN];
24 char wid[TOKLEN];
25 while (scanf("%s", cmd) == 1) {
26 if (!strcmp("name", cmd)) {
27 scanf("%s", name);
28 trfn_psfont(name);
30 if (!strcmp("char", cmd)) {
31 scanf("%s width %s", ch, wid);
32 trfn_char(ch, NULL, atoi(wid), -1);
34 if (!strcmp("kernpair", cmd)) {
35 scanf("%s %s width %s", c1, c2, wid);
36 trfn_kern(c1, c2, atoi(wid));
38 if (!strcmp("feature", cmd)) {
39 scanf("%s substitution %s %s", name, c1, c2);
40 trfn_sub(c1, c2);
45 static void afm_read(void)
47 char ch[TOKLEN], pos[TOKLEN];
48 char c1[TOKLEN], c2[TOKLEN];
49 char wid[TOKLEN];
50 char ln[1024];
51 while (fgets(ln, sizeof(ln), stdin)) {
52 if (ln[0] == '#')
53 continue;
54 if (!strncmp("FontName ", ln, 8)) {
55 sscanf(ln, "FontName %s", ch);
56 trfn_psfont(ch);
57 continue;
59 if (!strncmp("StartCharMetrics", ln, 16))
60 break;
62 while (fgets(ln, sizeof(ln), stdin)) {
63 if (ln[0] == '#')
64 continue;
65 if (!strncmp("EndCharMetrics", ln, 14))
66 break;
67 if (sscanf(ln, "C %s ; WX %s ; N %s", pos, wid, ch) == 3)
68 trfn_char(ch, pos, atoi(wid), -1);
70 while (fgets(ln, sizeof(ln), stdin)) {
71 if (ln[0] == '#')
72 continue;
73 if (!strncmp("StartKernPairs", ln, 14))
74 break;
76 while (fgets(ln, sizeof(ln), stdin)) {
77 if (ln[0] == '#')
78 continue;
79 if (!strncmp("EndKernPairs", ln, 12))
80 break;
81 if (sscanf(ln, "KPX %s %s %s", c1, c2, wid) == 3)
82 trfn_kern(c1, c2, atoi(wid));
86 static char *usage =
87 "Usage: mktrfn [options] <input >output\n"
88 "Options:\n"
89 " -o \tread the output of otfdump for otf and ttf files (default)\n"
90 " -a \tread an AFM file\n"
91 " -s \tspecial font\n"
92 " -p name \toverride font postscript name\n"
93 " -t name \tset font troff name\n"
94 " -r res \tset device resolution (720)\n"
95 " -k kmin \tspecify the minimum amount of kerning (0)\n";
97 int main(int argc, char *argv[])
99 int afm = 0;
100 int i = 1;
101 int res = 720;
102 int spc = 0;
103 int kmin = 0;
104 for (i = 1; i < argc && argv[i][0] == '-'; i++) {
105 switch (argv[i][1]) {
106 case 'a':
107 afm = 1;
108 break;
109 case 'k':
110 kmin = atoi(argv[i][2] ? argv[i] + 2 : argv[++i]);
111 break;
112 case 'o':
113 afm = 0;
114 break;
115 case 'p':
116 trfn_psfont(argv[i][2] ? argv[i] + 2 : argv[++i]);
117 break;
118 case 'r':
119 res = atoi(argv[i][2] ? argv[i] + 2 : argv[++i]);
120 break;
121 case 's':
122 spc = 1;
123 break;
124 case 't':
125 trfn_trfont(argv[i][2] ? argv[i] + 2 : argv[++i]);
126 break;
127 default:
128 printf("%s", usage);
129 return 0;
132 trfn_init(res, spc, kmin);
133 if (afm)
134 afm_read();
135 else
136 otfdump_read();
137 trfn_print();
138 trfn_done();
139 return 0;