xref: /plan9/sys/src/cmd/postscript/common/misc.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier /*
2*219b2ee8SDavid du Colombier  *
3*219b2ee8SDavid du Colombier  * General purpose routines.
4*219b2ee8SDavid du Colombier  *
5*219b2ee8SDavid du Colombier  */
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier #include <stdio.h>
8*219b2ee8SDavid du Colombier #include <ctype.h>
9*219b2ee8SDavid du Colombier #include <sys/types.h>
10*219b2ee8SDavid du Colombier #include <fcntl.h>
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier #include "gen.h"
13*219b2ee8SDavid du Colombier #include "ext.h"
14*219b2ee8SDavid du Colombier #include "path.h"
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier int	nolist = 0;			/* number of specified ranges */
17*219b2ee8SDavid du Colombier int	olist[50];			/* processing range pairs */
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier /*****************************************************************************/
20*219b2ee8SDavid du Colombier 
21*219b2ee8SDavid du Colombier out_list(str)
22*219b2ee8SDavid du Colombier 
23*219b2ee8SDavid du Colombier     char	*str;
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier {
26*219b2ee8SDavid du Colombier 
27*219b2ee8SDavid du Colombier     int		start, stop;
28*219b2ee8SDavid du Colombier 
29*219b2ee8SDavid du Colombier /*
30*219b2ee8SDavid du Colombier  *
31*219b2ee8SDavid du Colombier  * Grab page ranges from str, save them in olist[], and update the nolist
32*219b2ee8SDavid du Colombier  * count. Range syntax matches nroff/troff syntax.
33*219b2ee8SDavid du Colombier  *
34*219b2ee8SDavid du Colombier  */
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier     while ( *str && nolist < sizeof(olist) - 2 ) {
37*219b2ee8SDavid du Colombier 	start = stop = str_convert(&str, 0);
38*219b2ee8SDavid du Colombier 
39*219b2ee8SDavid du Colombier 	if ( *str == '-' && *str++ )
40*219b2ee8SDavid du Colombier 	    stop = str_convert(&str, 9999);
41*219b2ee8SDavid du Colombier 
42*219b2ee8SDavid du Colombier 	if ( start > stop )
43*219b2ee8SDavid du Colombier 	    error(FATAL, "illegal range %d-%d", start, stop);
44*219b2ee8SDavid du Colombier 
45*219b2ee8SDavid du Colombier 	olist[nolist++] = start;
46*219b2ee8SDavid du Colombier 	olist[nolist++] = stop;
47*219b2ee8SDavid du Colombier 
48*219b2ee8SDavid du Colombier 	if ( *str != '\0' ) str++;
49*219b2ee8SDavid du Colombier     }	/* End while */
50*219b2ee8SDavid du Colombier 
51*219b2ee8SDavid du Colombier     olist[nolist] = 0;
52*219b2ee8SDavid du Colombier 
53*219b2ee8SDavid du Colombier }   /* End of out_list */
54*219b2ee8SDavid du Colombier 
55*219b2ee8SDavid du Colombier /*****************************************************************************/
56*219b2ee8SDavid du Colombier 
57*219b2ee8SDavid du Colombier in_olist(num)
58*219b2ee8SDavid du Colombier 
59*219b2ee8SDavid du Colombier     int		num;
60*219b2ee8SDavid du Colombier 
61*219b2ee8SDavid du Colombier {
62*219b2ee8SDavid du Colombier 
63*219b2ee8SDavid du Colombier     int		i;
64*219b2ee8SDavid du Colombier 
65*219b2ee8SDavid du Colombier /*
66*219b2ee8SDavid du Colombier  *
67*219b2ee8SDavid du Colombier  * Return ON if num is in the current page range list. Print everything if
68*219b2ee8SDavid du Colombier  * there's no list.
69*219b2ee8SDavid du Colombier  *
70*219b2ee8SDavid du Colombier  */
71*219b2ee8SDavid du Colombier     if ( nolist == 0 )
72*219b2ee8SDavid du Colombier 	return(ON);
73*219b2ee8SDavid du Colombier 
74*219b2ee8SDavid du Colombier     for ( i = 0; i < nolist; i += 2 )
75*219b2ee8SDavid du Colombier 	if ( num >= olist[i] && num <= olist[i+1] )
76*219b2ee8SDavid du Colombier 	    return(ON);
77*219b2ee8SDavid du Colombier 
78*219b2ee8SDavid du Colombier     return(OFF);
79*219b2ee8SDavid du Colombier 
80*219b2ee8SDavid du Colombier }   /* End of in_olist */
81*219b2ee8SDavid du Colombier 
82*219b2ee8SDavid du Colombier /*****************************************************************************/
83*219b2ee8SDavid du Colombier 
84*219b2ee8SDavid du Colombier setencoding(name)
85*219b2ee8SDavid du Colombier 
86*219b2ee8SDavid du Colombier     char	*name;
87*219b2ee8SDavid du Colombier 
88*219b2ee8SDavid du Colombier {
89*219b2ee8SDavid du Colombier 
90*219b2ee8SDavid du Colombier     char	path[150];
91*219b2ee8SDavid du Colombier 
92*219b2ee8SDavid du Colombier /*
93*219b2ee8SDavid du Colombier  *
94*219b2ee8SDavid du Colombier  * Include the font encoding file selected by name. It's a full pathname if
95*219b2ee8SDavid du Colombier  * it begins with /, otherwise append suffix ".enc" and look for the file in
96*219b2ee8SDavid du Colombier  * ENCODINGDIR. Missing files are silently ignored.
97*219b2ee8SDavid du Colombier  *
98*219b2ee8SDavid du Colombier  */
99*219b2ee8SDavid du Colombier 
100*219b2ee8SDavid du Colombier     if ( name == NULL )
101*219b2ee8SDavid du Colombier 	name = "Default";
102*219b2ee8SDavid du Colombier 
103*219b2ee8SDavid du Colombier     if ( *name == '/' )
104*219b2ee8SDavid du Colombier 	strcpy(path, name);
105*219b2ee8SDavid du Colombier     else sprintf(path, "%s/%s.enc", ENCODINGDIR, name);
106*219b2ee8SDavid du Colombier 
107*219b2ee8SDavid du Colombier     if ( cat(path) == TRUE )
108*219b2ee8SDavid du Colombier 	writing = strncmp(name, "UTF", 3) == 0;
109*219b2ee8SDavid du Colombier 
110*219b2ee8SDavid du Colombier }   /* End of setencoding */
111*219b2ee8SDavid du Colombier 
112*219b2ee8SDavid du Colombier /*****************************************************************************/
113*219b2ee8SDavid du Colombier 
114*219b2ee8SDavid du Colombier cat(file)
115*219b2ee8SDavid du Colombier 
116*219b2ee8SDavid du Colombier     char	*file;
117*219b2ee8SDavid du Colombier 
118*219b2ee8SDavid du Colombier {
119*219b2ee8SDavid du Colombier 
120*219b2ee8SDavid du Colombier     int		fd_in;
121*219b2ee8SDavid du Colombier     int		fd_out;
122*219b2ee8SDavid du Colombier     char	buf[512];
123*219b2ee8SDavid du Colombier     int		count;
124*219b2ee8SDavid du Colombier 
125*219b2ee8SDavid du Colombier /*
126*219b2ee8SDavid du Colombier  *
127*219b2ee8SDavid du Colombier  * Copy *file to stdout. Return FALSE is there was a problem.
128*219b2ee8SDavid du Colombier  *
129*219b2ee8SDavid du Colombier  */
130*219b2ee8SDavid du Colombier 
131*219b2ee8SDavid du Colombier     fflush(stdout);
132*219b2ee8SDavid du Colombier 
133*219b2ee8SDavid du Colombier     if ( (fd_in = open(file, O_RDONLY)) == -1 )
134*219b2ee8SDavid du Colombier 	return(FALSE);
135*219b2ee8SDavid du Colombier 
136*219b2ee8SDavid du Colombier     fd_out = fileno(stdout);
137*219b2ee8SDavid du Colombier     while ( (count = read(fd_in, buf, sizeof(buf))) > 0 )
138*219b2ee8SDavid du Colombier 	write(fd_out, buf, count);
139*219b2ee8SDavid du Colombier 
140*219b2ee8SDavid du Colombier     close(fd_in);
141*219b2ee8SDavid du Colombier 
142*219b2ee8SDavid du Colombier     return(TRUE);
143*219b2ee8SDavid du Colombier 
144*219b2ee8SDavid du Colombier }   /* End of cat */
145*219b2ee8SDavid du Colombier 
146*219b2ee8SDavid du Colombier /*****************************************************************************/
147*219b2ee8SDavid du Colombier 
148*219b2ee8SDavid du Colombier str_convert(str, err)
149*219b2ee8SDavid du Colombier 
150*219b2ee8SDavid du Colombier     char	**str;
151*219b2ee8SDavid du Colombier     int		err;
152*219b2ee8SDavid du Colombier 
153*219b2ee8SDavid du Colombier {
154*219b2ee8SDavid du Colombier 
155*219b2ee8SDavid du Colombier     int		i;
156*219b2ee8SDavid du Colombier 
157*219b2ee8SDavid du Colombier /*
158*219b2ee8SDavid du Colombier  *
159*219b2ee8SDavid du Colombier  * Grab the next integer from **str and return its value or err if *str
160*219b2ee8SDavid du Colombier  * isn't an integer. *str is modified after each digit is read.
161*219b2ee8SDavid du Colombier  *
162*219b2ee8SDavid du Colombier  */
163*219b2ee8SDavid du Colombier 
164*219b2ee8SDavid du Colombier     if ( ! isdigit(**str) )
165*219b2ee8SDavid du Colombier 	return(err);
166*219b2ee8SDavid du Colombier 
167*219b2ee8SDavid du Colombier     for ( i = 0; isdigit(**str); *str += 1 )
168*219b2ee8SDavid du Colombier 	i = 10 * i + **str - '0';
169*219b2ee8SDavid du Colombier 
170*219b2ee8SDavid du Colombier     return(i);
171*219b2ee8SDavid du Colombier 
172*219b2ee8SDavid du Colombier }   /* End of str_convert */
173*219b2ee8SDavid du Colombier 
174*219b2ee8SDavid du Colombier /*****************************************************************************/
175*219b2ee8SDavid du Colombier 
176*219b2ee8SDavid du Colombier error(kind, mesg, a1, a2, a3)
177*219b2ee8SDavid du Colombier 
178*219b2ee8SDavid du Colombier     int		kind;
179*219b2ee8SDavid du Colombier     char	*mesg;
180*219b2ee8SDavid du Colombier     unsigned	a1, a2, a3;
181*219b2ee8SDavid du Colombier 
182*219b2ee8SDavid du Colombier {
183*219b2ee8SDavid du Colombier 
184*219b2ee8SDavid du Colombier /*
185*219b2ee8SDavid du Colombier  *
186*219b2ee8SDavid du Colombier  * Print an error message and quit if kind is FATAL.
187*219b2ee8SDavid du Colombier  *
188*219b2ee8SDavid du Colombier  */
189*219b2ee8SDavid du Colombier 
190*219b2ee8SDavid du Colombier     if ( mesg != NULL && *mesg != '\0' ) {
191*219b2ee8SDavid du Colombier 	fprintf(stderr, "%s: ", prog_name);
192*219b2ee8SDavid du Colombier 	fprintf(stderr, mesg, a1, a2, a3);
193*219b2ee8SDavid du Colombier 	if ( lineno > 0 )
194*219b2ee8SDavid du Colombier 	    fprintf(stderr, " (line %d)", lineno);
195*219b2ee8SDavid du Colombier 	if ( position > 0 )
196*219b2ee8SDavid du Colombier 	    fprintf(stderr, " (near byte %d)", position);
197*219b2ee8SDavid du Colombier 	putc('\n', stderr);
198*219b2ee8SDavid du Colombier     }	/* End if */
199*219b2ee8SDavid du Colombier 
200*219b2ee8SDavid du Colombier     if ( kind == FATAL && ignore == OFF ) {
201*219b2ee8SDavid du Colombier 	if ( temp_file != NULL )
202*219b2ee8SDavid du Colombier 	    unlink(temp_file);
203*219b2ee8SDavid du Colombier 	exit(x_stat | 01);
204*219b2ee8SDavid du Colombier     }	/* End if */
205*219b2ee8SDavid du Colombier 
206*219b2ee8SDavid du Colombier }   /* End of error */
207*219b2ee8SDavid du Colombier 
208*219b2ee8SDavid du Colombier /*****************************************************************************/
209*219b2ee8SDavid du Colombier 
210*219b2ee8SDavid du Colombier void interrupt(sig)
211*219b2ee8SDavid du Colombier 
212*219b2ee8SDavid du Colombier     int		sig;
213*219b2ee8SDavid du Colombier 
214*219b2ee8SDavid du Colombier {
215*219b2ee8SDavid du Colombier 
216*219b2ee8SDavid du Colombier /*
217*219b2ee8SDavid du Colombier  *
218*219b2ee8SDavid du Colombier  * Signal handler for translators.
219*219b2ee8SDavid du Colombier  *
220*219b2ee8SDavid du Colombier  */
221*219b2ee8SDavid du Colombier 
222*219b2ee8SDavid du Colombier     if ( temp_file != NULL )
223*219b2ee8SDavid du Colombier 	unlink(temp_file);
224*219b2ee8SDavid du Colombier 
225*219b2ee8SDavid du Colombier     exit(1);
226*219b2ee8SDavid du Colombier 
227*219b2ee8SDavid du Colombier }   /* End of interrupt */
228*219b2ee8SDavid du Colombier 
229*219b2ee8SDavid du Colombier /*****************************************************************************/
230*219b2ee8SDavid du Colombier 
231