1 rizwank 1.1 /*
2 * Create font map for AFM files.
3 * Copyright (c) 1995, 1996, 1997 Markku Rossi.
4 *
5 * Author: Markku Rossi <mtr@iki.fi>
6 */
7
8 /*
9 * This file is part of GNU enscript.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2, or (at your option)
14 * any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 rizwank 1.1 * along with this program; see the file COPYING. If not, write to
23 * the Free Software Foundation, 59 Temple Place - Suite 330,
24 * Boston, MA 02111-1307, USA.
25 */
26
27 #ifdef HAVE_CONFIG_H
28 #include <config.h>
29 #endif
30
31 #include <stdio.h>
32
33 #if HAVE_STDLIB_H
34 #include <stdlib.h>
35 #endif
36
37 #if HAVE_STRING_H
38 #include <string.h>
39 #endif
40
41 #if ENABLE_NLS
42 #include <libintl.h>
43 rizwank 1.1 #define _(String) gettext (String)
44 #else
45 #define _(String) String
46 #endif
47
48 #if HAVE_LC_MESSAGES
49 #include <locale.h>
50 #endif
51
52 #include "afm.h"
53 #include "getopt.h"
54
55
56 /*
57 * Definitions.
58 */
59
60 #define HANDLE_ERROR(msg) \
61 if (error != AFM_SUCCESS) \
62 { \
63 char buf[256]; \
64 rizwank 1.1 afm_error_to_string (error, buf); \
65 fprintf (stderr, "%s: %s: %s\n", program, msg, buf); \
66 exit (1); \
67 }
68
69
70 /*
71 * Prototypes for static functions.
72 */
73
74 static void usage ();
75
76
77 /*
78 * Static variables.
79 */
80
81 /* Options. */
82
83 /*
84 * --output-file, -p
85 rizwank 1.1 *
86 * The name of the file to which font map is stored. If name is NULL,
87 * leaves output to stdout.
88 */
89 static char *fname = "font.map";
90
91
92 static char *program;
93
94 static struct option long_options[] =
95 {
96 {"output-file", required_argument, 0, 'p'},
97 {"help", no_argument, 0, 'h'},
98 {"version", no_argument, 0, 'V'},
99 {NULL, 0, 0, 0},
100 };
101
102 /*
103 * Global functions.
104 */
105
106 rizwank 1.1 int
107 main (int argc, char *argv[])
108 {
109 AFMError error;
110 AFMHandle afm;
111 AFMFont font;
112 int i;
113 FILE *ofp;
114 FILE *mfp;
115
116 program = strrchr (argv[0], '/');
117 if (program == NULL)
118 program = argv[0];
119 else
120 program++;
121
122 /* Make getopt_long() to use our modified programname. */
123 argv[0] = program;
124
125 /* Internationalization. */
126 #if HAVE_SETLOCALE
127 rizwank 1.1 #if HAVE_LC_MESSAGES
128 setlocale (LC_MESSAGES, "");
129 #endif
130 #endif
131 #if ENABLE_NLS
132 bindtextdomain (PACKAGE, LOCALEDIR);
133 textdomain (PACKAGE);
134 #endif
135
136 /* Handle arguments. */
137 while (1)
138 {
139 int option_index = 0;
140 int c;
141
142 c = getopt_long (argc, argv, "p:h", long_options, &option_index);
143 if (c == -1)
144 break;
145
146 switch (c)
147 {
148 rizwank 1.1 case 'h': /* help */
149 usage ();
150 exit (0);
151
152 case 'p': /* output file */
153 /* Check output file "-". */
154 if (strcmp (optarg, "-") == 0)
155 fname = NULL;
156 else
157 fname = optarg;
158 break;
159
160 case 'V': /* version number */
161 printf ("%s for GNU %s %s\n", program, PACKAGE, VERSION);
162 exit (0);
163 break;
164
165 case '?': /* errors in arguments */
166 usage ();
167 exit (1);
168 break;
169 rizwank 1.1 }
170 }
171
172 /* Open output file. */
173 printf (_("file=%s\n"), fname ? fname : _("stdout"));
174 if (fname)
175 {
176 ofp = fopen (fname, "w");
177 if (ofp == NULL)
178 {
179 char buf[256];
180
181 sprintf (buf, _("%s: couldn't open output file \"%s\""),
182 program, fname);
183 perror (buf);
184 exit (1);
185 }
186 mfp = stdout;
187 }
188 else
189 {
190 rizwank 1.1 ofp = stdout;
191 mfp = stderr;
192 }
193
194 error = afm_create (NULL, 0, &afm);
195 HANDLE_ERROR (_("couldn't create AFM library"));
196
197 for (i = optind; i < argc; i++)
198 {
199 fprintf (mfp, "%s...\n", argv[i]);
200 error = afm_open_file (afm, AFM_I_MINIMUM, argv[i], &font);
201 if (error == AFM_SUCCESS)
202 {
203 char *cp;
204 char *sf;
205 int len;
206
207 cp = strrchr (argv[i], '/');
208 if (cp == NULL)
209 cp = argv[i];
210 else
211 rizwank 1.1 cp++;
212
213 sf = strrchr (argv[i], '.');
214 if (sf)
215 len = sf - cp;
216 else
217 len = strlen (cp);
218
219 fprintf (ofp, "%-30s\t%.*s\n", font->global_info.FontName, len, cp);
220 (void) afm_close_font (font);
221 }
222 else
223 {
224 char buf[256];
225 afm_error_to_string (error, buf);
226 fprintf (mfp, "%s: %s\n", program, buf);
227 }
228 }
229
230 if (fname)
231 fclose (ofp);
232 rizwank 1.1
233 return 0;
234 }
235
236
237 /*
238 * Static functions.
239 */
240
241 static void
242 usage ()
243 {
244 printf (_("\
245 Usage: %s [OPTION]... FILE...\n\
246 Mandatory arguments to long options are mandatory for short options too.\n\
247 -h, --help print this help and exit\n\
248 -p, --output-file=NAME print output to file NAME (default file is\n\
249 font.map). If FILE is `-', leavy output to\n\
250 stdout.\n\
251 -V, --version print version number\n"), program);
252 }
|