Blame


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