2 /* Copyright (C) 1989-1992, 2000, 2001 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
7 groff 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 groff 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. */
29 #include "stringclass.h"
33 extern "C" const char *Version_string;
35 static void usage(FILE *stream);
37 static void version();
38 static void convert_font(const font_params &, FILE *, FILE *);
40 typedef int font_params::*param_t;
46 { "x-height", &font_params::x_height },
47 { "fig-height", &font_params::fig_height },
48 { "asc-height", &font_params::asc_height },
49 { "body-height", &font_params::body_height },
50 { "cap-height", &font_params::cap_height },
51 { "comma-depth", &font_params::comma_depth },
52 { "desc-depth", &font_params::desc_depth },
53 { "body-depth", &font_params::body_depth },
56 // These are all in thousandths of an em.
57 // These values are correct for PostScript Times Roman.
59 #define DEFAULT_X_HEIGHT 448
60 #define DEFAULT_FIG_HEIGHT 676
61 #define DEFAULT_ASC_HEIGHT 682
62 #define DEFAULT_BODY_HEIGHT 676
63 #define DEFAULT_CAP_HEIGHT 662
64 #define DEFAULT_COMMA_DEPTH 143
65 #define DEFAULT_DESC_DEPTH 217
66 #define DEFAULT_BODY_DEPTH 177
68 int main(int argc, char **argv)
70 program_name = argv[0];
72 for (i = 1; i < argc; i++) {
73 if (!strcmp(argv[i], "-v") || !strcmp(argv[i],"--version"))
75 if (!strcmp(argv[i],"--help")) {
83 if (sscanf(argv[argc-3], "%d", &resolution) != 1)
86 fatal("resolution must be > 0");
88 if (sscanf(argv[argc-2], "%d", &unitwidth) != 1)
91 fatal("unitwidth must be > 0");
93 const char *font = argv[argc-1];
94 param.italic = (font[0] != '\0' && strchr(font, '\0')[-1] == 'I');
95 param.em = (resolution*unitwidth)/72;
96 param.x_height = DEFAULT_X_HEIGHT;
97 param.fig_height = DEFAULT_FIG_HEIGHT;
98 param.asc_height = DEFAULT_ASC_HEIGHT;
99 param.body_height = DEFAULT_BODY_HEIGHT;
100 param.cap_height = DEFAULT_CAP_HEIGHT;
101 param.comma_depth = DEFAULT_COMMA_DEPTH;
102 param.desc_depth = DEFAULT_DESC_DEPTH;
103 param.body_depth = DEFAULT_BODY_DEPTH;
104 for (i = 1; i < argc && argv[i][0] == '-'; i++) {
105 if (argv[i][1] == '-' && argv[i][2] == '\0') {
113 if (j >= sizeof(param_table)/sizeof(param_table[0]))
114 fatal("parameter `%1' not recognized", argv[i] + 1);
115 if (strcmp(param_table[j].name, argv[i] + 1) == 0)
118 if (sscanf(argv[i+1], "%d", &(param.*(param_table[j].par))) != 1)
119 fatal("invalid argument `%1'", argv[i+1]);
125 FILE *infp = fopen(font, "r");
127 fatal("can't open `%1': %2", font, strerror(errno));
128 convert_font(param, infp, stdout);
132 static void usage(FILE *stream)
134 fprintf(stream, "usage: %s [-v] [-param value] ... "
135 "resolution unitwidth font\n",
144 static void version()
146 printf("GNU addftinfo (groff) version %s\n", Version_string);
150 static int get_line(FILE *fp, string *p)
154 while ((c = getc(fp)) != EOF) {
159 return p->length() > 0;
162 static void convert_font(const font_params ¶m, FILE *infp, FILE *outfp)
165 while (get_line(infp, &s)) {
166 put_string(s, outfp);
168 && strncmp(&s[0], "charset", 7))
171 while (get_line(infp, &s)) {
174 const char *p = s.contents();
177 while (*p != '\0' && !csspace(*p))
181 for (const char *q = s.contents(); q < p; q++)
185 metric.width = (int)strtol(p, &next, 10);
187 printf("%d", metric.width);
189 metric.type = (int)strtol(p, &next, 10);
192 guess(name.contents(), param, &metric);
193 if (metric.sk == 0) {
194 if (metric.left_ic == 0) {
195 if (metric.ic == 0) {
196 if (metric.depth == 0) {
197 if (metric.height != 0)
198 printf(",%d", metric.height);
201 printf(",%d,%d", metric.height, metric.depth);
204 printf(",%d,%d,%d", metric.height, metric.depth, metric.ic);
207 printf(",%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
211 printf(",%d,%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
212 metric.left_ic, metric.sk);