2 * Copyright (c) 2014 - 2015 Steffen (Daode) Nurpmeso <sdaoden@users.sf.net>.
4 * Copyright (C) 1989 - 1992, 2000, 2001 Free Software Foundation, Inc.
5 * Written by James Clark (jjc@jclark.com)
7 * This is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2, or (at your option) any later
12 * This is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 * You should have received a copy of the GNU General Public License along
18 * with groff; see the file COPYING. If not, write to the Free Software
19 * Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA.
23 #include "addftinfo-config.h"
35 #include "stringclass.h"
37 static void usage(FILE *stream
);
39 static void version();
40 static void convert_font(const font_params
&, FILE *, FILE *);
42 typedef int font_params::*param_t
;
47 } param_table
[] = { // FIXME const
48 { "x-height", &font_params::x_height
},
49 { "fig-height", &font_params::fig_height
},
50 { "asc-height", &font_params::asc_height
},
51 { "body-height", &font_params::body_height
},
52 { "cap-height", &font_params::cap_height
},
53 { "comma-depth", &font_params::comma_depth
},
54 { "desc-depth", &font_params::desc_depth
},
55 { "body-depth", &font_params::body_depth
},
58 int main(int argc
, char **argv
)
60 program_name
= argv
[0];
62 for (i
= 1; i
< argc
; i
++) {
63 if (!strcmp(argv
[i
], "-v") || !strcmp(argv
[i
],"--version"))
65 if (!strcmp(argv
[i
],"--help")) {
73 if (sscanf(argv
[argc
-3], "%d", &resolution
) != 1)
76 fatal("resolution must be > 0");
78 if (sscanf(argv
[argc
-2], "%d", &unitwidth
) != 1)
81 fatal("unitwidth must be > 0");
83 const char *font
= argv
[argc
-1];
84 param
.italic
= (font
[0] != '\0' && strchr(font
, '\0')[-1] == 'I');
85 param
.em
= (resolution
*unitwidth
)/72;
86 param
.x_height
= DEFAULT_X_HEIGHT
;
87 param
.fig_height
= DEFAULT_FIG_HEIGHT
;
88 param
.asc_height
= DEFAULT_ASC_HEIGHT
;
89 param
.body_height
= DEFAULT_BODY_HEIGHT
;
90 param
.cap_height
= DEFAULT_CAP_HEIGHT
;
91 param
.comma_depth
= DEFAULT_COMMA_DEPTH
;
92 param
.desc_depth
= DEFAULT_DESC_DEPTH
;
93 param
.body_depth
= DEFAULT_BODY_DEPTH
;
94 for (i
= 1; i
< argc
&& argv
[i
][0] == '-'; i
++) {
95 if (argv
[i
][1] == '-' && argv
[i
][2] == '\0') {
103 if (j
>= NELEM(param_table
))
104 fatal("parameter `%1' not recognized", argv
[i
] + 1);
105 if (strcmp(param_table
[j
].name
, argv
[i
] + 1) == 0)
108 if (sscanf(argv
[i
+1], "%d", &(param
.*(param_table
[j
].par
))) != 1)
109 fatal("invalid argument `%1'", argv
[i
+1]);
115 FILE *infp
= fopen(font
, "r");
117 fatal("can't open `%1': %2", font
, strerror(errno
));
118 convert_font(param
, infp
, stdout
);
122 static void usage(FILE *stream
)
124 fprintf(stream
, "Synopsis: %s [-v] [-param value] ... "
125 "resolution unitwidth font\n",
134 static void version()
136 printf(L_ADDFTINFO
" (" T_ROFF
") v" VERSION
);
140 static int get_line(FILE *fp
, string
*p
)
144 while ((c
= getc(fp
)) != EOF
) {
149 return p
->length() > 0;
152 static void convert_font(const font_params
¶m
, FILE *infp
, FILE *outfp
)
155 while (get_line(infp
, &s
)) {
156 put_string(s
, outfp
);
158 && strncmp(&s
[0], "charset", 7))
161 while (get_line(infp
, &s
)) {
164 const char *p
= s
.contents();
167 while (*p
!= '\0' && !csspace(*p
))
171 for (const char *q
= s
.contents(); q
< p
; q
++)
175 metric
.width
= (int)strtol(p
, &next
, 10);
177 printf("%d", metric
.width
);
179 metric
.type
= (int)strtol(p
, &next
, 10);
182 guess(name
.contents(), param
, &metric
);
183 if (metric
.sk
== 0) {
184 if (metric
.left_ic
== 0) {
185 if (metric
.ic
== 0) {
186 if (metric
.depth
== 0) {
187 if (metric
.height
!= 0)
188 printf(",%d", metric
.height
);
191 printf(",%d,%d", metric
.height
, metric
.depth
);
194 printf(",%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
);
197 printf(",%d,%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
,
201 printf(",%d,%d,%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
,
202 metric
.left_ic
, metric
.sk
);