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