Blame


1 61f5c35c 2004-05-15 devnull /*
2 61f5c35c 2004-05-15 devnull *
3 61f5c35c 2004-05-15 devnull * download - host resident font downloader
4 61f5c35c 2004-05-15 devnull *
5 61f5c35c 2004-05-15 devnull * Prepends host resident fonts to PostScript input files. The program assumes
6 61f5c35c 2004-05-15 devnull * the input files are part of a single PostScript job and that requested fonts
7 61f5c35c 2004-05-15 devnull * can be downloaded at the start of each input file. Downloaded fonts are the
8 61f5c35c 2004-05-15 devnull * ones named in a %%DocumentFonts: comment and listed in a special map table.
9 61f5c35c 2004-05-15 devnull * Map table pathnames (supplied using the -m option) that begin with a / are
10 61f5c35c 2004-05-15 devnull * taken as is. Otherwise the final pathname is built using *hostfontdir (-H
11 61f5c35c 2004-05-15 devnull * option), *mapname (-m option), and *suffix.
12 61f5c35c 2004-05-15 devnull *
13 61f5c35c 2004-05-15 devnull * The map table consists of fontname-filename pairs, separated by white space.
14 61f5c35c 2004-05-15 devnull * Comments are introduced by % (as in PostScript) and extend to the end of the
15 61f5c35c 2004-05-15 devnull * current line. The only fonts that can be downloaded are the ones listed in
16 61f5c35c 2004-05-15 devnull * the active map table that point the program to a readable Unix file. A request
17 61f5c35c 2004-05-15 devnull * for an unlisted font or inaccessible file is ignored. All font requests are
18 61f5c35c 2004-05-15 devnull * ignored if the map table can't be read. In that case the program simply copies
19 61f5c35c 2004-05-15 devnull * the input files to stdout.
20 61f5c35c 2004-05-15 devnull *
21 61f5c35c 2004-05-15 devnull * An example (but not one to follow) of what can be in a map table is,
22 61f5c35c 2004-05-15 devnull *
23 61f5c35c 2004-05-15 devnull * %
24 61f5c35c 2004-05-15 devnull * % Map requests for Bookman-Light to file *hostfontdir/KR
25 61f5c35c 2004-05-15 devnull * %
26 61f5c35c 2004-05-15 devnull *
27 61f5c35c 2004-05-15 devnull * Bookman-Light KR % Keeping everything (including the map
28 61f5c35c 2004-05-15 devnull * % table) in *hostfontdir seems like the
29 61f5c35c 2004-05-15 devnull * % cleanest approach.
30 61f5c35c 2004-05-15 devnull *
31 61f5c35c 2004-05-15 devnull * %
32 61f5c35c 2004-05-15 devnull * % Map Palatino-Roman to file *hostfontdir/palatino/Roman
33 61f5c35c 2004-05-15 devnull * %
34 61f5c35c 2004-05-15 devnull * Palatino-Roman palatino/Roman
35 61f5c35c 2004-05-15 devnull *
36 61f5c35c 2004-05-15 devnull * % Map ZapfDingbats to file /usr/lib/host/dingbats
37 61f5c35c 2004-05-15 devnull *
38 61f5c35c 2004-05-15 devnull * ZapfDingbats /usr/lib/host/dingbats
39 61f5c35c 2004-05-15 devnull *
40 61f5c35c 2004-05-15 devnull * Once again, file names that begin with a / are taken as is. All others have
41 61f5c35c 2004-05-15 devnull * *hostfontdir/ prepended to the file string associated with a particular font.
42 61f5c35c 2004-05-15 devnull *
43 61f5c35c 2004-05-15 devnull * Map table can be associated with a printer model (e.g. a LaserWriter), a
44 61f5c35c 2004-05-15 devnull * printer destination, or whatever - the choice is up to an administrator.
45 61f5c35c 2004-05-15 devnull * By destination may be best if your spooler is running several private
46 61f5c35c 2004-05-15 devnull * printers. Host resident fonts are usually purchased under a license that
47 61f5c35c 2004-05-15 devnull * restricts their use to a limited number of printers. A font licensed for
48 61f5c35c 2004-05-15 devnull * a single printer should only be used on that printer.
49 61f5c35c 2004-05-15 devnull *
50 61f5c35c 2004-05-15 devnull * Was written quickly, so there's much room for improvement. Undoubtedly should
51 61f5c35c 2004-05-15 devnull * be a more general program (e.g. scan for other comments).
52 61f5c35c 2004-05-15 devnull *
53 61f5c35c 2004-05-15 devnull */
54 61f5c35c 2004-05-15 devnull
55 dcc9531c 2004-09-20 devnull #include <u.h>
56 61f5c35c 2004-05-15 devnull #include <stdio.h>
57 61f5c35c 2004-05-15 devnull #include <signal.h>
58 61f5c35c 2004-05-15 devnull #include <sys/types.h>
59 61f5c35c 2004-05-15 devnull #include <fcntl.h>
60 61f5c35c 2004-05-15 devnull #include <sys/stat.h>
61 61f5c35c 2004-05-15 devnull #include <string.h>
62 e8fb1d3e 2004-05-17 devnull #include <stdlib.h>
63 e8fb1d3e 2004-05-17 devnull #include <unistd.h>
64 dcc9531c 2004-09-20 devnull #include <libc.h>
65 61f5c35c 2004-05-15 devnull
66 7ea6c4fc 2005-01-14 devnull #include "../common/ext.h"
67 61f5c35c 2004-05-15 devnull #include "comments.h" /* PostScript file structuring comments */
68 61f5c35c 2004-05-15 devnull #include "gen.h" /* general purpose definitions */
69 61f5c35c 2004-05-15 devnull #include "path.h" /* for temporary directory */
70 61f5c35c 2004-05-15 devnull #include "ext.h" /* external variable declarations */
71 61f5c35c 2004-05-15 devnull #include "download.h" /* a few special definitions */
72 61f5c35c 2004-05-15 devnull
73 61f5c35c 2004-05-15 devnull char *temp_dir = TEMPDIR; /* temp directory - for copying stdin */
74 61f5c35c 2004-05-15 devnull char *hostfontdir = HOSTDIR; /* host resident directory */
75 61f5c35c 2004-05-15 devnull char *mapname = "map"; /* map table - usually in *hostfontdir */
76 61f5c35c 2004-05-15 devnull char *suffix = ""; /* appended to the map table pathname */
77 61f5c35c 2004-05-15 devnull Map *map = NULL; /* device font map table */
78 61f5c35c 2004-05-15 devnull char *stringspace = NULL; /* for storing font and file strings */
79 61f5c35c 2004-05-15 devnull int next = 0; /* next free slot in map[] */
80 61f5c35c 2004-05-15 devnull
81 61f5c35c 2004-05-15 devnull char *residentfonts = NULL; /* list of printer resident fonts */
82 61f5c35c 2004-05-15 devnull char *printer = NULL; /* printer name - only for Unix 4.0 lp */
83 61f5c35c 2004-05-15 devnull
84 61f5c35c 2004-05-15 devnull char buf[2048]; /* input file line buffer */
85 61f5c35c 2004-05-15 devnull char *comment = DOCUMENTFONTS; /* look for this comment */
86 61f5c35c 2004-05-15 devnull int atend = FALSE; /* TRUE only if a comment says so */
87 61f5c35c 2004-05-15 devnull
88 61f5c35c 2004-05-15 devnull FILE *fp_in; /* next input file */
89 61f5c35c 2004-05-15 devnull FILE *fp_temp = NULL; /* for copying stdin */
90 61f5c35c 2004-05-15 devnull
91 e8fb1d3e 2004-05-17 devnull void init_signals();
92 e8fb1d3e 2004-05-17 devnull void options();
93 e8fb1d3e 2004-05-17 devnull void readmap();
94 e8fb1d3e 2004-05-17 devnull void readresident();
95 e8fb1d3e 2004-05-17 devnull void arguments();
96 e8fb1d3e 2004-05-17 devnull void done();
97 e8fb1d3e 2004-05-17 devnull void download();
98 e8fb1d3e 2004-05-17 devnull int lookup(char *font);
99 e8fb1d3e 2004-05-17 devnull void copyfonts(char *list);
100 e8fb1d3e 2004-05-17 devnull void copyinput();
101 e8fb1d3e 2004-05-17 devnull extern int cat(char *file);
102 e8fb1d3e 2004-05-17 devnull extern void error(int errtype, char *fmt, ...);
103 e8fb1d3e 2004-05-17 devnull
104 61f5c35c 2004-05-15 devnull /*****************************************************************************/
105 61f5c35c 2004-05-15 devnull
106 e8fb1d3e 2004-05-17 devnull int
107 61f5c35c 2004-05-15 devnull main(agc, agv)
108 61f5c35c 2004-05-15 devnull
109 61f5c35c 2004-05-15 devnull int agc;
110 61f5c35c 2004-05-15 devnull char *agv[];
111 61f5c35c 2004-05-15 devnull
112 61f5c35c 2004-05-15 devnull {
113 61f5c35c 2004-05-15 devnull
114 61f5c35c 2004-05-15 devnull /*
115 61f5c35c 2004-05-15 devnull *
116 61f5c35c 2004-05-15 devnull * Host resident font downloader. The input files are assumed to be part of a
117 61f5c35c 2004-05-15 devnull * single PostScript job.
118 61f5c35c 2004-05-15 devnull *
119 61f5c35c 2004-05-15 devnull */
120 61f5c35c 2004-05-15 devnull
121 61f5c35c 2004-05-15 devnull argc = agc; /* other routines may want them */
122 61f5c35c 2004-05-15 devnull argv = agv;
123 dcc9531c 2004-09-20 devnull
124 dcc9531c 2004-09-20 devnull hostfontdir = unsharp(hostfontdir);
125 dcc9531c 2004-09-20 devnull
126 b855148c 2004-05-16 devnull fp_in = stdin;
127 61f5c35c 2004-05-15 devnull
128 61f5c35c 2004-05-15 devnull prog_name = argv[0]; /* just for error messages */
129 61f5c35c 2004-05-15 devnull
130 61f5c35c 2004-05-15 devnull init_signals(); /* sets up interrupt handling */
131 61f5c35c 2004-05-15 devnull options(); /* first get command line options */
132 61f5c35c 2004-05-15 devnull readmap(); /* read the font map table */
133 61f5c35c 2004-05-15 devnull readresident(); /* and the optional resident font list */
134 61f5c35c 2004-05-15 devnull arguments(); /* then process non-option arguments */
135 61f5c35c 2004-05-15 devnull done(); /* and clean things up */
136 61f5c35c 2004-05-15 devnull exit(x_stat); /* not much could be wrong */
137 61f5c35c 2004-05-15 devnull
138 61f5c35c 2004-05-15 devnull } /* End of main */
139 61f5c35c 2004-05-15 devnull
140 61f5c35c 2004-05-15 devnull /*****************************************************************************/
141 61f5c35c 2004-05-15 devnull
142 e8fb1d3e 2004-05-17 devnull void
143 e8fb1d3e 2004-05-17 devnull init_signals(void)
144 61f5c35c 2004-05-15 devnull {
145 61f5c35c 2004-05-15 devnull
146 61f5c35c 2004-05-15 devnull /*
147 61f5c35c 2004-05-15 devnull *
148 61f5c35c 2004-05-15 devnull * Makes sure we handle interrupts properly.
149 61f5c35c 2004-05-15 devnull *
150 61f5c35c 2004-05-15 devnull */
151 61f5c35c 2004-05-15 devnull
152 61f5c35c 2004-05-15 devnull if ( signal(SIGINT, interrupt) == SIG_IGN ) {
153 61f5c35c 2004-05-15 devnull signal(SIGINT, SIG_IGN);
154 61f5c35c 2004-05-15 devnull signal(SIGQUIT, SIG_IGN);
155 61f5c35c 2004-05-15 devnull signal(SIGHUP, SIG_IGN);
156 61f5c35c 2004-05-15 devnull } else {
157 61f5c35c 2004-05-15 devnull signal(SIGHUP, interrupt);
158 61f5c35c 2004-05-15 devnull signal(SIGQUIT, interrupt);
159 61f5c35c 2004-05-15 devnull } /* End else */
160 61f5c35c 2004-05-15 devnull
161 61f5c35c 2004-05-15 devnull signal(SIGTERM, interrupt);
162 61f5c35c 2004-05-15 devnull
163 61f5c35c 2004-05-15 devnull } /* End of init_signals */
164 61f5c35c 2004-05-15 devnull
165 61f5c35c 2004-05-15 devnull /*****************************************************************************/
166 61f5c35c 2004-05-15 devnull
167 e8fb1d3e 2004-05-17 devnull void
168 e8fb1d3e 2004-05-17 devnull options(void)
169 61f5c35c 2004-05-15 devnull {
170 61f5c35c 2004-05-15 devnull
171 61f5c35c 2004-05-15 devnull int ch; /* return value from getopt() */
172 61f5c35c 2004-05-15 devnull char *optnames = "c:fm:p:r:H:T:DI";
173 61f5c35c 2004-05-15 devnull
174 61f5c35c 2004-05-15 devnull extern char *optarg; /* used by getopt() */
175 61f5c35c 2004-05-15 devnull extern int optind;
176 61f5c35c 2004-05-15 devnull
177 61f5c35c 2004-05-15 devnull /*
178 61f5c35c 2004-05-15 devnull *
179 61f5c35c 2004-05-15 devnull * Reads and processes the command line options.
180 61f5c35c 2004-05-15 devnull *
181 61f5c35c 2004-05-15 devnull */
182 61f5c35c 2004-05-15 devnull
183 61f5c35c 2004-05-15 devnull while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
184 61f5c35c 2004-05-15 devnull switch ( ch ) {
185 61f5c35c 2004-05-15 devnull case 'c': /* look for this comment */
186 61f5c35c 2004-05-15 devnull comment = optarg;
187 61f5c35c 2004-05-15 devnull break;
188 61f5c35c 2004-05-15 devnull
189 61f5c35c 2004-05-15 devnull case 'f': /* force a complete input file scan */
190 61f5c35c 2004-05-15 devnull atend = TRUE;
191 61f5c35c 2004-05-15 devnull break;
192 61f5c35c 2004-05-15 devnull
193 61f5c35c 2004-05-15 devnull case 'm': /* printer map table name */
194 61f5c35c 2004-05-15 devnull mapname = optarg;
195 61f5c35c 2004-05-15 devnull break;
196 61f5c35c 2004-05-15 devnull
197 61f5c35c 2004-05-15 devnull case 'p': /* printer name - for Unix 4.0 lp */
198 61f5c35c 2004-05-15 devnull printer = optarg;
199 61f5c35c 2004-05-15 devnull break;
200 61f5c35c 2004-05-15 devnull
201 61f5c35c 2004-05-15 devnull case 'r': /* resident font list */
202 61f5c35c 2004-05-15 devnull residentfonts = optarg;
203 61f5c35c 2004-05-15 devnull break;
204 61f5c35c 2004-05-15 devnull
205 61f5c35c 2004-05-15 devnull case 'H': /* host resident font directory */
206 61f5c35c 2004-05-15 devnull hostfontdir = optarg;
207 61f5c35c 2004-05-15 devnull break;
208 61f5c35c 2004-05-15 devnull
209 61f5c35c 2004-05-15 devnull case 'T': /* temporary file directory */
210 61f5c35c 2004-05-15 devnull temp_dir = optarg;
211 61f5c35c 2004-05-15 devnull break;
212 61f5c35c 2004-05-15 devnull
213 61f5c35c 2004-05-15 devnull case 'D': /* debug flag */
214 61f5c35c 2004-05-15 devnull debug = ON;
215 61f5c35c 2004-05-15 devnull break;
216 61f5c35c 2004-05-15 devnull
217 61f5c35c 2004-05-15 devnull case 'I': /* ignore FATAL errors */
218 61f5c35c 2004-05-15 devnull ignore = ON;
219 61f5c35c 2004-05-15 devnull break;
220 61f5c35c 2004-05-15 devnull
221 61f5c35c 2004-05-15 devnull case '?': /* don't understand the option */
222 61f5c35c 2004-05-15 devnull error(FATAL, "");
223 61f5c35c 2004-05-15 devnull break;
224 61f5c35c 2004-05-15 devnull
225 61f5c35c 2004-05-15 devnull default: /* don't know what to do for ch */
226 61f5c35c 2004-05-15 devnull error(FATAL, "missing case for option %c\n", ch);
227 61f5c35c 2004-05-15 devnull break;
228 61f5c35c 2004-05-15 devnull } /* End switch */
229 61f5c35c 2004-05-15 devnull } /* End while */
230 61f5c35c 2004-05-15 devnull
231 61f5c35c 2004-05-15 devnull argc -= optind; /* get ready for non-option args */
232 61f5c35c 2004-05-15 devnull argv += optind;
233 61f5c35c 2004-05-15 devnull
234 61f5c35c 2004-05-15 devnull } /* End of options */
235 61f5c35c 2004-05-15 devnull
236 61f5c35c 2004-05-15 devnull /*****************************************************************************/
237 61f5c35c 2004-05-15 devnull
238 e8fb1d3e 2004-05-17 devnull void
239 e8fb1d3e 2004-05-17 devnull readmap(void)
240 61f5c35c 2004-05-15 devnull {
241 61f5c35c 2004-05-15 devnull
242 61f5c35c 2004-05-15 devnull char *path;
243 61f5c35c 2004-05-15 devnull char *ptr;
244 61f5c35c 2004-05-15 devnull int fd;
245 61f5c35c 2004-05-15 devnull struct stat sbuf;
246 61f5c35c 2004-05-15 devnull
247 61f5c35c 2004-05-15 devnull /*
248 61f5c35c 2004-05-15 devnull *
249 61f5c35c 2004-05-15 devnull * Initializes the map table by reading an ASCII mapping file. If mapname begins
250 61f5c35c 2004-05-15 devnull * with a / it's the map table. Otherwise hostfontdir, mapname, and suffix are
251 61f5c35c 2004-05-15 devnull * combined to build the final pathname. If we can open the file we read it all
252 61f5c35c 2004-05-15 devnull * into memory, erase comments, and separate the font and file name pairs. When
253 61f5c35c 2004-05-15 devnull * we leave next points to the next free slot in the map[] array. If it's zero
254 61f5c35c 2004-05-15 devnull * nothing was in the file or we couldn't open it.
255 61f5c35c 2004-05-15 devnull *
256 61f5c35c 2004-05-15 devnull */
257 61f5c35c 2004-05-15 devnull
258 61f5c35c 2004-05-15 devnull if ( hostfontdir == NULL || mapname == NULL )
259 61f5c35c 2004-05-15 devnull return;
260 61f5c35c 2004-05-15 devnull
261 61f5c35c 2004-05-15 devnull if ( *mapname != '/' ) {
262 61f5c35c 2004-05-15 devnull if ( (path = (char *)malloc(strlen(hostfontdir) + strlen(mapname) +
263 61f5c35c 2004-05-15 devnull strlen(suffix) + 2)) == NULL )
264 61f5c35c 2004-05-15 devnull error(FATAL, "no memory");
265 61f5c35c 2004-05-15 devnull sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix);
266 61f5c35c 2004-05-15 devnull } else path = mapname;
267 61f5c35c 2004-05-15 devnull
268 b855148c 2004-05-16 devnull if ( (fd = open(path, 0)) != -1 ) {
269 61f5c35c 2004-05-15 devnull if ( fstat(fd, &sbuf) == -1 )
270 61f5c35c 2004-05-15 devnull error(FATAL, "can't fstat %s", path);
271 61f5c35c 2004-05-15 devnull if ( (stringspace = (char *)malloc(sbuf.st_size + 2)) == NULL )
272 61f5c35c 2004-05-15 devnull error(FATAL, "no memory");
273 61f5c35c 2004-05-15 devnull if ( read(fd, stringspace, sbuf.st_size) == -1 )
274 61f5c35c 2004-05-15 devnull error(FATAL, "can't read %s", path);
275 61f5c35c 2004-05-15 devnull close(fd);
276 61f5c35c 2004-05-15 devnull
277 61f5c35c 2004-05-15 devnull stringspace[sbuf.st_size] = '\n'; /* just to be safe */
278 61f5c35c 2004-05-15 devnull stringspace[sbuf.st_size+1] = '\0';
279 61f5c35c 2004-05-15 devnull for ( ptr = stringspace; *ptr != '\0'; ptr++ ) /* erase comments */
280 61f5c35c 2004-05-15 devnull if ( *ptr == '%' )
281 61f5c35c 2004-05-15 devnull for ( ; *ptr != '\n' ; ptr++ )
282 61f5c35c 2004-05-15 devnull *ptr = ' ';
283 61f5c35c 2004-05-15 devnull
284 61f5c35c 2004-05-15 devnull for ( ptr = stringspace; ; next++ ) {
285 61f5c35c 2004-05-15 devnull if ( (next % 50) == 0 )
286 61f5c35c 2004-05-15 devnull map = allocate(map, next+50);
287 61f5c35c 2004-05-15 devnull map[next].downloaded = FALSE;
288 61f5c35c 2004-05-15 devnull map[next].font = strtok(ptr, " \t\n");
289 61f5c35c 2004-05-15 devnull map[next].file = strtok(ptr = NULL, " \t\n");
290 61f5c35c 2004-05-15 devnull if ( map[next].font == NULL )
291 61f5c35c 2004-05-15 devnull break;
292 61f5c35c 2004-05-15 devnull if ( map[next].file == NULL )
293 61f5c35c 2004-05-15 devnull error(FATAL, "map table format error - check %s", path);
294 61f5c35c 2004-05-15 devnull } /* End for */
295 61f5c35c 2004-05-15 devnull } /* End if */
296 61f5c35c 2004-05-15 devnull
297 61f5c35c 2004-05-15 devnull } /* End of readmap */
298 61f5c35c 2004-05-15 devnull
299 61f5c35c 2004-05-15 devnull /*****************************************************************************/
300 61f5c35c 2004-05-15 devnull
301 e8fb1d3e 2004-05-17 devnull void
302 e8fb1d3e 2004-05-17 devnull readresident(void)
303 61f5c35c 2004-05-15 devnull {
304 61f5c35c 2004-05-15 devnull
305 61f5c35c 2004-05-15 devnull FILE *fp;
306 61f5c35c 2004-05-15 devnull char *path;
307 61f5c35c 2004-05-15 devnull int ch;
308 61f5c35c 2004-05-15 devnull int n;
309 61f5c35c 2004-05-15 devnull
310 61f5c35c 2004-05-15 devnull /*
311 61f5c35c 2004-05-15 devnull *
312 61f5c35c 2004-05-15 devnull * Reads a file that lists the resident fonts for a particular printer and marks
313 61f5c35c 2004-05-15 devnull * each font as already downloaded. Nothing's done if the file can't be read or
314 61f5c35c 2004-05-15 devnull * there's no mapping file. Comments, as in the map file, begin with a % and
315 61f5c35c 2004-05-15 devnull * extend to the end of the line. Added for Unix 4.0 lp.
316 61f5c35c 2004-05-15 devnull *
317 61f5c35c 2004-05-15 devnull */
318 61f5c35c 2004-05-15 devnull
319 61f5c35c 2004-05-15 devnull if ( next == 0 || (printer == NULL && residentfonts == NULL) )
320 61f5c35c 2004-05-15 devnull return;
321 61f5c35c 2004-05-15 devnull
322 61f5c35c 2004-05-15 devnull if ( printer != NULL ) { /* use Unix 4.0 lp pathnames */
323 61f5c35c 2004-05-15 devnull sprintf(buf, "%s/printers/%s", HOSTDIR, printer);
324 dcc9531c 2004-09-20 devnull path = unsharp(buf);
325 61f5c35c 2004-05-15 devnull } else path = residentfonts;
326 61f5c35c 2004-05-15 devnull
327 b855148c 2004-05-16 devnull if ( (fp = fopen(path, "r")) != NULL ) {
328 61f5c35c 2004-05-15 devnull while ( fscanf(fp, "%s", buf) != EOF )
329 61f5c35c 2004-05-15 devnull if ( buf[0] == '%' )
330 61f5c35c 2004-05-15 devnull while ( (ch = getc(fp)) != EOF && ch != '\n' ) ;
331 61f5c35c 2004-05-15 devnull else if ( (n = lookup(buf)) < next )
332 61f5c35c 2004-05-15 devnull map[n].downloaded = TRUE;
333 61f5c35c 2004-05-15 devnull fclose(fp);
334 61f5c35c 2004-05-15 devnull } /* End if */
335 61f5c35c 2004-05-15 devnull
336 61f5c35c 2004-05-15 devnull } /* End of readresident */
337 61f5c35c 2004-05-15 devnull
338 61f5c35c 2004-05-15 devnull /*****************************************************************************/
339 61f5c35c 2004-05-15 devnull
340 e8fb1d3e 2004-05-17 devnull void
341 e8fb1d3e 2004-05-17 devnull arguments(void)
342 61f5c35c 2004-05-15 devnull {
343 61f5c35c 2004-05-15 devnull
344 61f5c35c 2004-05-15 devnull /*
345 61f5c35c 2004-05-15 devnull *
346 61f5c35c 2004-05-15 devnull * Makes sure all the non-option command line arguments are processed. If we get
347 61f5c35c 2004-05-15 devnull * here and there aren't any arguments left, or if '-' is one of the input files
348 61f5c35c 2004-05-15 devnull * we'll translate stdin. Assumes input files are part of a single PostScript
349 61f5c35c 2004-05-15 devnull * job and fonts can be downloaded at the start of each file.
350 61f5c35c 2004-05-15 devnull *
351 61f5c35c 2004-05-15 devnull */
352 61f5c35c 2004-05-15 devnull
353 61f5c35c 2004-05-15 devnull if ( argc < 1 )
354 61f5c35c 2004-05-15 devnull download();
355 61f5c35c 2004-05-15 devnull else {
356 61f5c35c 2004-05-15 devnull while ( argc > 0 ) {
357 61f5c35c 2004-05-15 devnull fp_temp = NULL;
358 61f5c35c 2004-05-15 devnull if ( strcmp(*argv, "-") == 0 )
359 61f5c35c 2004-05-15 devnull fp_in = stdin;
360 b855148c 2004-05-16 devnull else if ( (fp_in = fopen(*argv, "r")) == NULL )
361 61f5c35c 2004-05-15 devnull error(FATAL, "can't open %s", *argv);
362 61f5c35c 2004-05-15 devnull download();
363 61f5c35c 2004-05-15 devnull if ( fp_in != stdin )
364 61f5c35c 2004-05-15 devnull fclose(fp_in);
365 61f5c35c 2004-05-15 devnull if ( fp_temp != NULL )
366 61f5c35c 2004-05-15 devnull fclose(fp_temp);
367 61f5c35c 2004-05-15 devnull argc--;
368 61f5c35c 2004-05-15 devnull argv++;
369 61f5c35c 2004-05-15 devnull } /* End while */
370 61f5c35c 2004-05-15 devnull } /* End else */
371 61f5c35c 2004-05-15 devnull
372 61f5c35c 2004-05-15 devnull } /* End of arguments */
373 61f5c35c 2004-05-15 devnull
374 61f5c35c 2004-05-15 devnull /*****************************************************************************/
375 61f5c35c 2004-05-15 devnull
376 e8fb1d3e 2004-05-17 devnull void
377 e8fb1d3e 2004-05-17 devnull done(void)
378 61f5c35c 2004-05-15 devnull {
379 61f5c35c 2004-05-15 devnull
380 61f5c35c 2004-05-15 devnull /*
381 61f5c35c 2004-05-15 devnull *
382 61f5c35c 2004-05-15 devnull * Clean things up before we quit.
383 61f5c35c 2004-05-15 devnull *
384 61f5c35c 2004-05-15 devnull */
385 61f5c35c 2004-05-15 devnull
386 61f5c35c 2004-05-15 devnull if ( temp_file != NULL )
387 61f5c35c 2004-05-15 devnull unlink(temp_file);
388 61f5c35c 2004-05-15 devnull
389 61f5c35c 2004-05-15 devnull } /* End of done */
390 61f5c35c 2004-05-15 devnull
391 61f5c35c 2004-05-15 devnull /*****************************************************************************/
392 61f5c35c 2004-05-15 devnull
393 e8fb1d3e 2004-05-17 devnull void
394 e8fb1d3e 2004-05-17 devnull download(void)
395 61f5c35c 2004-05-15 devnull {
396 61f5c35c 2004-05-15 devnull
397 61f5c35c 2004-05-15 devnull int infontlist = FALSE;
398 61f5c35c 2004-05-15 devnull
399 61f5c35c 2004-05-15 devnull /*
400 61f5c35c 2004-05-15 devnull *
401 61f5c35c 2004-05-15 devnull * If next is zero the map table is empty and all we do is copy the input file
402 61f5c35c 2004-05-15 devnull * to stdout. Otherwise we read the input file looking for %%DocumentFonts: or
403 61f5c35c 2004-05-15 devnull * continuation comments, add any accessible fonts to the output file, and then
404 61f5c35c 2004-05-15 devnull * append the input file. When reading stdin we append lines to fp_temp and
405 61f5c35c 2004-05-15 devnull * recover them when we're ready to copy the input file. fp_temp will often
406 61f5c35c 2004-05-15 devnull * only contain part of stdin - if there's no %%DocumentFonts: (atend) comment
407 61f5c35c 2004-05-15 devnull * we stop reading fp_in after the header.
408 61f5c35c 2004-05-15 devnull *
409 61f5c35c 2004-05-15 devnull */
410 61f5c35c 2004-05-15 devnull
411 61f5c35c 2004-05-15 devnull if ( next > 0 ) {
412 61f5c35c 2004-05-15 devnull if ( fp_in == stdin ) {
413 61f5c35c 2004-05-15 devnull if ( (temp_file = tempnam(temp_dir, "post")) == NULL )
414 61f5c35c 2004-05-15 devnull error(FATAL, "can't generate temp file name");
415 61f5c35c 2004-05-15 devnull if ( (fp_temp = fopen(temp_file, "w+r")) == NULL )
416 61f5c35c 2004-05-15 devnull error(FATAL, "can't open %s", temp_file);
417 61f5c35c 2004-05-15 devnull unlink(temp_file);
418 61f5c35c 2004-05-15 devnull } /* End if */
419 61f5c35c 2004-05-15 devnull
420 61f5c35c 2004-05-15 devnull while ( fgets(buf, sizeof(buf), fp_in) != NULL ) {
421 61f5c35c 2004-05-15 devnull if ( fp_temp != NULL )
422 61f5c35c 2004-05-15 devnull fprintf(fp_temp, "%s", buf);
423 61f5c35c 2004-05-15 devnull if ( buf[0] != '%' || buf[1] != '%' ) {
424 61f5c35c 2004-05-15 devnull if ( (buf[0] != '%' || buf[1] != '!') && atend == FALSE )
425 61f5c35c 2004-05-15 devnull break;
426 61f5c35c 2004-05-15 devnull infontlist = FALSE;
427 61f5c35c 2004-05-15 devnull } else if ( strncmp(buf, comment, strlen(comment)) == 0 ) {
428 61f5c35c 2004-05-15 devnull copyfonts(buf);
429 61f5c35c 2004-05-15 devnull infontlist = TRUE;
430 61f5c35c 2004-05-15 devnull } else if ( buf[2] == '+' && infontlist == TRUE )
431 61f5c35c 2004-05-15 devnull copyfonts(buf);
432 61f5c35c 2004-05-15 devnull else infontlist = FALSE;
433 61f5c35c 2004-05-15 devnull } /* End while */
434 61f5c35c 2004-05-15 devnull } /* End if */
435 61f5c35c 2004-05-15 devnull
436 61f5c35c 2004-05-15 devnull copyinput();
437 61f5c35c 2004-05-15 devnull
438 61f5c35c 2004-05-15 devnull } /* End of download */
439 61f5c35c 2004-05-15 devnull
440 61f5c35c 2004-05-15 devnull /*****************************************************************************/
441 61f5c35c 2004-05-15 devnull
442 e8fb1d3e 2004-05-17 devnull void
443 61f5c35c 2004-05-15 devnull copyfonts(list)
444 61f5c35c 2004-05-15 devnull
445 61f5c35c 2004-05-15 devnull char *list;
446 61f5c35c 2004-05-15 devnull
447 61f5c35c 2004-05-15 devnull {
448 61f5c35c 2004-05-15 devnull
449 61f5c35c 2004-05-15 devnull char *font;
450 61f5c35c 2004-05-15 devnull char *path;
451 61f5c35c 2004-05-15 devnull int n;
452 61f5c35c 2004-05-15 devnull
453 61f5c35c 2004-05-15 devnull /*
454 61f5c35c 2004-05-15 devnull *
455 61f5c35c 2004-05-15 devnull * list points to a %%DocumentFonts: or continuation comment. What follows the
456 61f5c35c 2004-05-15 devnull * the keyword will be a list of fonts separated by white space (or (atend)).
457 61f5c35c 2004-05-15 devnull * Look for each font in the map table and if it's found copy the font file to
458 61f5c35c 2004-05-15 devnull * stdout (once only).
459 61f5c35c 2004-05-15 devnull *
460 61f5c35c 2004-05-15 devnull */
461 61f5c35c 2004-05-15 devnull
462 61f5c35c 2004-05-15 devnull strtok(list, " \n"); /* skip to the font list */
463 61f5c35c 2004-05-15 devnull
464 61f5c35c 2004-05-15 devnull while ( (font = strtok(NULL, " \t\n")) != NULL ) {
465 61f5c35c 2004-05-15 devnull if ( strcmp(font, ATEND) == 0 ) {
466 61f5c35c 2004-05-15 devnull atend = TRUE;
467 61f5c35c 2004-05-15 devnull break;
468 61f5c35c 2004-05-15 devnull } /* End if */
469 61f5c35c 2004-05-15 devnull if ( (n = lookup(font)) < next ) {
470 61f5c35c 2004-05-15 devnull if ( *map[n].file != '/' ) {
471 61f5c35c 2004-05-15 devnull if ( (path = (char *)malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL )
472 61f5c35c 2004-05-15 devnull error(FATAL, "no memory");
473 61f5c35c 2004-05-15 devnull sprintf(path, "%s/%s", hostfontdir, map[n].file);
474 b855148c 2004-05-16 devnull cat(path);
475 61f5c35c 2004-05-15 devnull free(path);
476 b855148c 2004-05-16 devnull } else cat(map[n].file);
477 61f5c35c 2004-05-15 devnull map[n].downloaded = TRUE;
478 61f5c35c 2004-05-15 devnull } /* End if */
479 61f5c35c 2004-05-15 devnull } /* End while */
480 61f5c35c 2004-05-15 devnull
481 61f5c35c 2004-05-15 devnull } /* End of copyfonts */
482 61f5c35c 2004-05-15 devnull
483 61f5c35c 2004-05-15 devnull /*****************************************************************************/
484 61f5c35c 2004-05-15 devnull
485 e8fb1d3e 2004-05-17 devnull void
486 e8fb1d3e 2004-05-17 devnull copyinput(void)
487 61f5c35c 2004-05-15 devnull {
488 61f5c35c 2004-05-15 devnull
489 61f5c35c 2004-05-15 devnull /*
490 61f5c35c 2004-05-15 devnull *
491 61f5c35c 2004-05-15 devnull * Copies the input file to stdout. If fp_temp isn't NULL seek to the start and
492 61f5c35c 2004-05-15 devnull * add it to the output file - it's a partial (or complete) copy of stdin made
493 61f5c35c 2004-05-15 devnull * by download(). Then copy fp_in, but only seek to the start if it's not stdin.
494 61f5c35c 2004-05-15 devnull *
495 61f5c35c 2004-05-15 devnull */
496 61f5c35c 2004-05-15 devnull
497 61f5c35c 2004-05-15 devnull if ( fp_temp != NULL ) {
498 61f5c35c 2004-05-15 devnull fseek(fp_temp, 0L, 0);
499 61f5c35c 2004-05-15 devnull while ( fgets(buf, sizeof(buf), fp_temp) != NULL )
500 61f5c35c 2004-05-15 devnull printf("%s", buf);
501 61f5c35c 2004-05-15 devnull } /* End if */
502 61f5c35c 2004-05-15 devnull
503 61f5c35c 2004-05-15 devnull if ( fp_in != stdin )
504 61f5c35c 2004-05-15 devnull fseek(fp_in, 0L, 0);
505 61f5c35c 2004-05-15 devnull
506 61f5c35c 2004-05-15 devnull while ( fgets(buf, sizeof(buf), fp_in) != NULL )
507 61f5c35c 2004-05-15 devnull printf("%s", buf);
508 61f5c35c 2004-05-15 devnull
509 61f5c35c 2004-05-15 devnull } /* End of copyinput */
510 61f5c35c 2004-05-15 devnull
511 61f5c35c 2004-05-15 devnull /*****************************************************************************/
512 61f5c35c 2004-05-15 devnull
513 e8fb1d3e 2004-05-17 devnull int
514 61f5c35c 2004-05-15 devnull lookup(font)
515 61f5c35c 2004-05-15 devnull
516 61f5c35c 2004-05-15 devnull char *font;
517 61f5c35c 2004-05-15 devnull
518 61f5c35c 2004-05-15 devnull {
519 61f5c35c 2004-05-15 devnull
520 61f5c35c 2004-05-15 devnull int i;
521 61f5c35c 2004-05-15 devnull
522 61f5c35c 2004-05-15 devnull /*
523 61f5c35c 2004-05-15 devnull *
524 61f5c35c 2004-05-15 devnull * Looks for *font in the map table. Return the map table index if found and
525 61f5c35c 2004-05-15 devnull * not yet downloaded - otherwise return next.
526 61f5c35c 2004-05-15 devnull *
527 61f5c35c 2004-05-15 devnull */
528 61f5c35c 2004-05-15 devnull
529 61f5c35c 2004-05-15 devnull for ( i = 0; i < next; i++ )
530 61f5c35c 2004-05-15 devnull if ( strcmp(font, map[i].font) == 0 ) {
531 61f5c35c 2004-05-15 devnull if ( map[i].downloaded == TRUE )
532 61f5c35c 2004-05-15 devnull i = next;
533 61f5c35c 2004-05-15 devnull break;
534 61f5c35c 2004-05-15 devnull } /* End if */
535 61f5c35c 2004-05-15 devnull
536 61f5c35c 2004-05-15 devnull return(i);
537 61f5c35c 2004-05-15 devnull
538 61f5c35c 2004-05-15 devnull } /* End of lookup */
539 61f5c35c 2004-05-15 devnull
540 61f5c35c 2004-05-15 devnull /*****************************************************************************/
541 61f5c35c 2004-05-15 devnull
542 61f5c35c 2004-05-15 devnull Map *allocate(ptr, num)
543 61f5c35c 2004-05-15 devnull
544 61f5c35c 2004-05-15 devnull Map *ptr;
545 61f5c35c 2004-05-15 devnull int num;
546 61f5c35c 2004-05-15 devnull
547 61f5c35c 2004-05-15 devnull {
548 61f5c35c 2004-05-15 devnull
549 61f5c35c 2004-05-15 devnull /*
550 61f5c35c 2004-05-15 devnull *
551 61f5c35c 2004-05-15 devnull * Allocates space for num Map elements. Calls malloc() if ptr is NULL and
552 61f5c35c 2004-05-15 devnull * realloc() otherwise.
553 61f5c35c 2004-05-15 devnull *
554 61f5c35c 2004-05-15 devnull */
555 61f5c35c 2004-05-15 devnull
556 61f5c35c 2004-05-15 devnull if ( ptr == NULL )
557 61f5c35c 2004-05-15 devnull ptr = (Map *)malloc(num * sizeof(Map));
558 61f5c35c 2004-05-15 devnull else ptr = (Map *)realloc(ptr, num * sizeof(Map));
559 61f5c35c 2004-05-15 devnull
560 61f5c35c 2004-05-15 devnull if ( ptr == NULL )
561 61f5c35c 2004-05-15 devnull error(FATAL, "no map memory");
562 61f5c35c 2004-05-15 devnull
563 61f5c35c 2004-05-15 devnull return(ptr);
564 61f5c35c 2004-05-15 devnull
565 61f5c35c 2004-05-15 devnull } /* End of allocate */
566 61f5c35c 2004-05-15 devnull
567 61f5c35c 2004-05-15 devnull /*****************************************************************************/
568 61f5c35c 2004-05-15 devnull