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
);