4 /* Copyright (C) 1989-1992, 2000, 2001 Free Software Foundation, Inc.
5 Written by James Clark (jjc@jclark.com)
7 This file is part of groff.
9 groff is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
14 groff is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License along
20 with groff; see the file COPYING. If not, write to the Free Software
21 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
31 #include "stringclass.h"
35 extern "C" const char *Version_string
;
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
;
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 // These are all in thousandths of an em.
59 // These values are correct for PostScript Times Roman.
61 #define DEFAULT_X_HEIGHT 448
62 #define DEFAULT_FIG_HEIGHT 676
63 #define DEFAULT_ASC_HEIGHT 682
64 #define DEFAULT_BODY_HEIGHT 676
65 #define DEFAULT_CAP_HEIGHT 662
66 #define DEFAULT_COMMA_DEPTH 143
67 #define DEFAULT_DESC_DEPTH 217
68 #define DEFAULT_BODY_DEPTH 177
70 int main(int argc
, char **argv
)
72 program_name
= argv
[0];
74 for (i
= 1; i
< argc
; i
++) {
75 if (!strcmp(argv
[i
], "-v") || !strcmp(argv
[i
],"--version"))
77 if (!strcmp(argv
[i
],"--help")) {
85 if (sscanf(argv
[argc
-3], "%d", &resolution
) != 1)
88 fatal("resolution must be > 0");
90 if (sscanf(argv
[argc
-2], "%d", &unitwidth
) != 1)
93 fatal("unitwidth must be > 0");
95 const char *font
= argv
[argc
-1];
96 param
.italic
= (font
[0] != '\0' && strchr(font
, '\0')[-1] == 'I');
97 param
.em
= (resolution
*unitwidth
)/72;
98 param
.x_height
= DEFAULT_X_HEIGHT
;
99 param
.fig_height
= DEFAULT_FIG_HEIGHT
;
100 param
.asc_height
= DEFAULT_ASC_HEIGHT
;
101 param
.body_height
= DEFAULT_BODY_HEIGHT
;
102 param
.cap_height
= DEFAULT_CAP_HEIGHT
;
103 param
.comma_depth
= DEFAULT_COMMA_DEPTH
;
104 param
.desc_depth
= DEFAULT_DESC_DEPTH
;
105 param
.body_depth
= DEFAULT_BODY_DEPTH
;
106 for (i
= 1; i
< argc
&& argv
[i
][0] == '-'; i
++) {
107 if (argv
[i
][1] == '-' && argv
[i
][2] == '\0') {
115 if (j
>= sizeof(param_table
)/sizeof(param_table
[0]))
116 fatal("parameter `%1' not recognized", argv
[i
] + 1);
117 if (strcmp(param_table
[j
].name
, argv
[i
] + 1) == 0)
120 if (sscanf(argv
[i
+1], "%d", &(param
.*(param_table
[j
].par
))) != 1)
121 fatal("invalid argument `%1'", argv
[i
+1]);
127 FILE *infp
= fopen(font
, "r");
129 fatal("can't open `%1': %2", font
, strerror(errno
));
130 convert_font(param
, infp
, stdout
);
134 static void usage(FILE *stream
)
136 fprintf(stream
, "usage: %s [-v] [-param value] ... "
137 "resolution unitwidth font\n",
146 static void version()
148 printf("GNU addftinfo (groff) version %s\n", Version_string
);
152 static int get_line(FILE *fp
, string
*p
)
156 while ((c
= getc(fp
)) != EOF
) {
161 return p
->length() > 0;
164 static void convert_font(const font_params
¶m
, FILE *infp
, FILE *outfp
)
167 while (get_line(infp
, &s
)) {
168 put_string(s
, outfp
);
170 && strncmp(&s
[0], "charset", 7))
173 while (get_line(infp
, &s
)) {
176 const char *p
= s
.contents();
179 while (*p
!= '\0' && !csspace(*p
))
183 for (const char *q
= s
.contents(); q
< p
; q
++)
187 metric
.width
= (int)strtol(p
, &next
, 10);
189 printf("%d", metric
.width
);
191 metric
.type
= (int)strtol(p
, &next
, 10);
194 guess(name
.contents(), param
, &metric
);
195 if (metric
.sk
== 0) {
196 if (metric
.left_ic
== 0) {
197 if (metric
.ic
== 0) {
198 if (metric
.depth
== 0) {
199 if (metric
.height
!= 0)
200 printf(",%d", metric
.height
);
203 printf(",%d,%d", metric
.height
, metric
.depth
);
206 printf(",%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
);
209 printf(",%d,%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
,
213 printf(",%d,%d,%d,%d,%d", metric
.height
, metric
.depth
, metric
.ic
,
214 metric
.left_ic
, metric
.sk
);