gen.sh: the arguments can specify FP and TP
[neatmkfn.git] / mkfn.c
blob78fcba2b55f2b3fa0fab2bf3c38dbf47fd744c04
1 /*
2 * mktrfn - generate troff font descriptions
4 * Copyright (C) 2012-2014 Ali Gholami Rudi <ali at rudi dot ir>
6 * This program is released under the Modified BSD license.
7 */
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include "trfn.h"
13 #define LEN(a) ((sizeof(a) / sizeof((a)[0])))
15 static char *trfn_scripts; /* filtered scripts */
16 static char *trfn_langs; /* filtered languages */
17 static char *trfn_order; /* feature ordering */
19 /* OpenType specifies a specific feature order for different scripts */
20 static char *scriptorder[][2] = {
21 {"latn", "ccmp,liga,clig,dist,kern,mark,mkmk"},
22 {"cyrl", "ccmp,liga,clig,dist,kern,mark,mkmk"},
23 {"grek", "ccmp,liga,clig,dist,kern,mark,mkmk"},
24 {"armn", "ccmp,liga,clig,dist,kern,mark,mkmk"},
25 {"geor", "ccmp,liga,clig,dist,kern,mark,mkmk"},
26 {"runr", "ccmp,liga,clig,dist,kern,mark,mkmk"},
27 {"ogam", "ccmp,liga,clig,dist,kern,mark,mkmk"},
28 {"arab", "ccmp,isol,fina,medi,init,rlig,calt,liga,dlig,cswh,mset,curs,kern,mark,mkmk"},
29 {"bugi", "locl,ccmp,rlig,liga,clig,calt,kern,dist,mark,mkmk"},
30 {"hang", "ccmp,ljmo,vjmo,tjmo"},
31 {"hebr", "ccmp,dlig,kern,mark"},
32 {"bng2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
33 {"dev2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
34 {"gjr2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
35 {"gur2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
36 {"knd2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
37 {"mlym", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
38 {"ory2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
39 {"tml2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
40 {"tml2", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
41 {"telu", "locl,nukt,akhn,rphf,blwf,half,pstf,vatu,cjct,init,pres,abvs,blws,psts,haln,calt,kern,dist,abvm,blwm"},
42 {"java", "locl,pref,abvf,blwf,pstf,pres,abvs,blws,psts,ccmp,rlig,liga,clig,calt,kern,dist,mark,mkmk"},
43 {"khmr", "pref,blwf,abvf,pstf,pres,blws,abvs,psts,clig,dist,blwm,abvm,mkmk"},
44 {"lao ", "ccmp,kern,mark,mkmk"},
45 {"mym2", "locl,rphf,pref,blwf,pstf,pres,abvs,blws,psts,kern,dist,mark,mkmk"},
46 {"sinh", "locl,ccmp,akhn,rphf,vatu,pstf,pres,abvs,blws,psts,kern,dist,abvm,blwm"},
47 {"syrc", "stch,ccmp,isol,fina,fin2,fin3,medi,med2,init,rlig,calt,liga,dlig,kern,mark,mkmk"},
48 {"thaa", "kern,mark"},
49 {"thai", "ccmp,kern,mark,mkmk"},
50 {"tibt", "ccmp,abvs,blws,calt,liga,kern,abvm,blwm,mkmk"},
53 /* return 1 if script script is to be included */
54 int trfn_script(char *script, int nscripts)
56 int i;
57 trfn_order = NULL;
58 for (i = 0; i < LEN(scriptorder); i++)
59 if (script && !strcmp(script, scriptorder[i][0]))
60 trfn_order = scriptorder[i][1];
61 if (!trfn_scripts)
62 return nscripts == 1 || !script ||
63 !strcmp("DFLT", script) || !strcmp("latn", script);
64 if (!strcmp("help", trfn_scripts))
65 fprintf(stderr, "script: %s\n", script ? script : "");
66 if (strchr(script, ' '))
67 *strchr(script, ' ') = '\0';
68 return !!strstr(trfn_scripts, script);
71 /* return 1 if language lang is to be included */
72 int trfn_lang(char *lang, int nlangs)
74 if (!trfn_langs)
75 return nlangs == 1 || !lang;
76 if (!lang)
77 lang = "";
78 if (!strcmp("help", trfn_langs))
79 fprintf(stderr, "lang: %s\n", lang);
80 if (strchr(lang, ' '))
81 *strchr(lang, ' ') = '\0';
82 return !!strstr(trfn_langs, lang);
85 int trfn_featrank(char *feat)
87 char *s = trfn_order ? strstr(trfn_order, feat) : NULL;
88 return s ? s - trfn_order : 1000;
91 int otf_read(void);
92 int afm_read(void);
93 void otf_feat(int res, int kmin, int warn);
95 static char *usage =
96 "Usage: mktrfn [options] <input >output\n"
97 "Options:\n"
98 " -a \tread an AFM file (default)\n"
99 " -o \tread an OTF file\n"
100 " -s \tspecial font\n"
101 " -p name \toverride font postscript name\n"
102 " -t name \tset font troff name\n"
103 " -r res \tset device resolution (720)\n"
104 " -k kmin \tspecify the minimum amount of kerning (0)\n"
105 " -b \tinclude glyph bounding boxes\n"
106 " -S scrs \tcomma-separated list of scripts to include (help to list)\n"
107 " -L langs\tcomma-separated list of languages to include (help to list)\n"
108 " -w \twarn about unsupported font features\n";
110 int main(int argc, char *argv[])
112 int afm = 1;
113 int res = 720;
114 int spc = 0;
115 int kmin = 0;
116 int bbox = 0;
117 int warn = 0;
118 int i;
119 for (i = 1; i < argc && argv[i][0] == '-'; i++) {
120 switch (argv[i][1]) {
121 case 'a':
122 afm = 1;
123 break;
124 case 'b':
125 bbox = 1;
126 break;
127 case 'k':
128 kmin = atoi(argv[i][2] ? argv[i] + 2 : argv[++i]);
129 break;
130 case 'L':
131 trfn_langs = argv[i][2] ? argv[i] + 2 : argv[++i];
132 break;
133 case 'o':
134 afm = 0;
135 break;
136 case 'p':
137 trfn_psfont(argv[i][2] ? argv[i] + 2 : argv[++i]);
138 break;
139 case 'r':
140 res = atoi(argv[i][2] ? argv[i] + 2 : argv[++i]);
141 break;
142 case 's':
143 spc = 1;
144 break;
145 case 'S':
146 trfn_scripts = argv[i][2] ? argv[i] + 2 : argv[++i];
147 break;
148 case 't':
149 trfn_trfont(argv[i][2] ? argv[i] + 2 : argv[++i]);
150 break;
151 case 'w':
152 warn = 1;
153 break;
154 default:
155 printf("%s", usage);
156 return 0;
159 trfn_init(res, spc, kmin, bbox);
160 if (afm)
161 afm_read();
162 else
163 otf_read();
164 trfn_print();
165 if (!afm)
166 otf_feat(res, kmin, warn);
167 trfn_done();
168 return 0;