Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull
4 bc7cb1a1 2003-11-23 devnull typedef struct PCB /* Control block controlling specification parse */
5 bc7cb1a1 2003-11-23 devnull {
6 bc7cb1a1 2003-11-23 devnull char *base; /* start of specification */
7 bc7cb1a1 2003-11-23 devnull char *current; /* current parse point */
8 bc7cb1a1 2003-11-23 devnull long last; /* last Rune returned */
9 bc7cb1a1 2003-11-23 devnull long final; /* final Rune in a span */
10 bc7cb1a1 2003-11-23 devnull } Pcb;
11 bc7cb1a1 2003-11-23 devnull
12 bc7cb1a1 2003-11-23 devnull uchar bits[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
13 bc7cb1a1 2003-11-23 devnull
14 bc7cb1a1 2003-11-23 devnull #define SETBIT(a, c) ((a)[(c)/8] |= bits[(c)&07])
15 bc7cb1a1 2003-11-23 devnull #define CLEARBIT(a,c) ((a)[(c)/8] &= ~bits[(c)&07])
16 bc7cb1a1 2003-11-23 devnull #define BITSET(a,c) ((a)[(c)/8] & bits[(c)&07])
17 bc7cb1a1 2003-11-23 devnull
18 0cadb430 2009-09-11 russcox #define MAXRUNE Runemax
19 bc7cb1a1 2003-11-23 devnull
20 bc7cb1a1 2003-11-23 devnull uchar f[(MAXRUNE+1)/8];
21 bc7cb1a1 2003-11-23 devnull uchar t[(MAXRUNE+1)/8];
22 bc7cb1a1 2003-11-23 devnull char wbuf[4096];
23 bc7cb1a1 2003-11-23 devnull char *wptr;
24 bc7cb1a1 2003-11-23 devnull
25 bc7cb1a1 2003-11-23 devnull Pcb pfrom, pto;
26 bc7cb1a1 2003-11-23 devnull
27 bc7cb1a1 2003-11-23 devnull int cflag;
28 bc7cb1a1 2003-11-23 devnull int dflag;
29 bc7cb1a1 2003-11-23 devnull int sflag;
30 bc7cb1a1 2003-11-23 devnull
31 bc7cb1a1 2003-11-23 devnull void complement(void);
32 bc7cb1a1 2003-11-23 devnull void delete(void);
33 bc7cb1a1 2003-11-23 devnull void squeeze(void);
34 bc7cb1a1 2003-11-23 devnull void translit(void);
35 bc7cb1a1 2003-11-23 devnull void error(char*);
36 bc7cb1a1 2003-11-23 devnull long canon(Pcb*);
37 bc7cb1a1 2003-11-23 devnull char *getrune(char*, Rune*);
38 bc7cb1a1 2003-11-23 devnull void Pinit(Pcb*, char*);
39 bc7cb1a1 2003-11-23 devnull void Prewind(Pcb *p);
40 bc7cb1a1 2003-11-23 devnull int readrune(int, long*);
41 bc7cb1a1 2003-11-23 devnull void wflush(int);
42 bc7cb1a1 2003-11-23 devnull void writerune(int, Rune);
43 bc7cb1a1 2003-11-23 devnull
44 bc7cb1a1 2003-11-23 devnull void
45 bc7cb1a1 2003-11-23 devnull main(int argc, char **argv)
46 bc7cb1a1 2003-11-23 devnull {
47 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
48 bc7cb1a1 2003-11-23 devnull case 's': sflag++; break;
49 bc7cb1a1 2003-11-23 devnull case 'd': dflag++; break;
50 bc7cb1a1 2003-11-23 devnull case 'c': cflag++; break;
51 bc7cb1a1 2003-11-23 devnull default: error("bad option");
52 bc7cb1a1 2003-11-23 devnull }ARGEND
53 bc7cb1a1 2003-11-23 devnull if(argc>0)
54 bc7cb1a1 2003-11-23 devnull Pinit(&pfrom, argv[0]);
55 bc7cb1a1 2003-11-23 devnull if(argc>1)
56 bc7cb1a1 2003-11-23 devnull Pinit(&pto, argv[1]);
57 bc7cb1a1 2003-11-23 devnull if(argc>2)
58 bc7cb1a1 2003-11-23 devnull error("arg count");
59 bc7cb1a1 2003-11-23 devnull if(dflag) {
60 bc7cb1a1 2003-11-23 devnull if ((sflag && argc != 2) || (!sflag && argc != 1))
61 bc7cb1a1 2003-11-23 devnull error("arg count");
62 bc7cb1a1 2003-11-23 devnull delete();
63 bc7cb1a1 2003-11-23 devnull } else {
64 bc7cb1a1 2003-11-23 devnull if (argc != 2)
65 bc7cb1a1 2003-11-23 devnull error("arg count");
66 bc7cb1a1 2003-11-23 devnull if (cflag)
67 bc7cb1a1 2003-11-23 devnull complement();
68 bc7cb1a1 2003-11-23 devnull else translit();
69 bc7cb1a1 2003-11-23 devnull }
70 bc7cb1a1 2003-11-23 devnull exits(0);
71 bc7cb1a1 2003-11-23 devnull }
72 bc7cb1a1 2003-11-23 devnull
73 bc7cb1a1 2003-11-23 devnull void
74 bc7cb1a1 2003-11-23 devnull delete(void)
75 bc7cb1a1 2003-11-23 devnull {
76 bc7cb1a1 2003-11-23 devnull long c, last;
77 bc7cb1a1 2003-11-23 devnull
78 bc7cb1a1 2003-11-23 devnull if (cflag) {
79 bc7cb1a1 2003-11-23 devnull memset((char *) f, 0xff, sizeof f);
80 bc7cb1a1 2003-11-23 devnull while ((c = canon(&pfrom)) >= 0)
81 bc7cb1a1 2003-11-23 devnull CLEARBIT(f, c);
82 bc7cb1a1 2003-11-23 devnull } else {
83 bc7cb1a1 2003-11-23 devnull while ((c = canon(&pfrom)) >= 0)
84 bc7cb1a1 2003-11-23 devnull SETBIT(f, c);
85 bc7cb1a1 2003-11-23 devnull }
86 bc7cb1a1 2003-11-23 devnull if (sflag) {
87 bc7cb1a1 2003-11-23 devnull while ((c = canon(&pto)) >= 0)
88 bc7cb1a1 2003-11-23 devnull SETBIT(t, c);
89 bc7cb1a1 2003-11-23 devnull }
90 bc7cb1a1 2003-11-23 devnull
91 3e899d02 2011-01-02 rsc last = Runemax+1;
92 bc7cb1a1 2003-11-23 devnull while (readrune(0, &c) > 0) {
93 bc7cb1a1 2003-11-23 devnull if(!BITSET(f, c) && (c != last || !BITSET(t,c))) {
94 bc7cb1a1 2003-11-23 devnull last = c;
95 bc7cb1a1 2003-11-23 devnull writerune(1, (Rune) c);
96 bc7cb1a1 2003-11-23 devnull }
97 bc7cb1a1 2003-11-23 devnull }
98 bc7cb1a1 2003-11-23 devnull wflush(1);
99 bc7cb1a1 2003-11-23 devnull }
100 bc7cb1a1 2003-11-23 devnull
101 bc7cb1a1 2003-11-23 devnull void
102 bc7cb1a1 2003-11-23 devnull complement(void)
103 bc7cb1a1 2003-11-23 devnull {
104 bc7cb1a1 2003-11-23 devnull Rune *p;
105 bc7cb1a1 2003-11-23 devnull int i;
106 bc7cb1a1 2003-11-23 devnull long from, to, lastc, high;
107 bc7cb1a1 2003-11-23 devnull
108 bc7cb1a1 2003-11-23 devnull lastc = 0;
109 bc7cb1a1 2003-11-23 devnull high = 0;
110 bc7cb1a1 2003-11-23 devnull while ((from = canon(&pfrom)) >= 0) {
111 bc7cb1a1 2003-11-23 devnull if (from > high) high = from;
112 bc7cb1a1 2003-11-23 devnull SETBIT(f, from);
113 bc7cb1a1 2003-11-23 devnull }
114 bc7cb1a1 2003-11-23 devnull while ((to = canon(&pto)) > 0) {
115 bc7cb1a1 2003-11-23 devnull if (to > high) high = to;
116 bc7cb1a1 2003-11-23 devnull SETBIT(t,to);
117 bc7cb1a1 2003-11-23 devnull }
118 bc7cb1a1 2003-11-23 devnull Prewind(&pto);
119 bc7cb1a1 2003-11-23 devnull if ((p = (Rune *) malloc((high+1)*sizeof(Rune))) == 0)
120 bc7cb1a1 2003-11-23 devnull error("can't allocate memory");
121 bc7cb1a1 2003-11-23 devnull for (i = 0; i <= high; i++){
122 bc7cb1a1 2003-11-23 devnull if (!BITSET(f,i)) {
123 bc7cb1a1 2003-11-23 devnull if ((to = canon(&pto)) < 0)
124 bc7cb1a1 2003-11-23 devnull to = lastc;
125 bc7cb1a1 2003-11-23 devnull else lastc = to;
126 bc7cb1a1 2003-11-23 devnull p[i] = to;
127 bc7cb1a1 2003-11-23 devnull }
128 bc7cb1a1 2003-11-23 devnull else p[i] = i;
129 bc7cb1a1 2003-11-23 devnull }
130 bc7cb1a1 2003-11-23 devnull if (sflag){
131 3e899d02 2011-01-02 rsc lastc = Runemax+1;
132 bc7cb1a1 2003-11-23 devnull while (readrune(0, &from) > 0) {
133 bc7cb1a1 2003-11-23 devnull if (from > high)
134 bc7cb1a1 2003-11-23 devnull from = to;
135 bc7cb1a1 2003-11-23 devnull else
136 bc7cb1a1 2003-11-23 devnull from = p[from];
137 bc7cb1a1 2003-11-23 devnull if (from != lastc || !BITSET(t,from)) {
138 bc7cb1a1 2003-11-23 devnull lastc = from;
139 bc7cb1a1 2003-11-23 devnull writerune(1, (Rune) from);
140 bc7cb1a1 2003-11-23 devnull }
141 bc7cb1a1 2003-11-23 devnull }
142 fa325e9b 2020-01-10 cross
143 bc7cb1a1 2003-11-23 devnull } else {
144 bc7cb1a1 2003-11-23 devnull while (readrune(0, &from) > 0){
145 bc7cb1a1 2003-11-23 devnull if (from > high)
146 bc7cb1a1 2003-11-23 devnull from = to;
147 bc7cb1a1 2003-11-23 devnull else
148 bc7cb1a1 2003-11-23 devnull from = p[from];
149 bc7cb1a1 2003-11-23 devnull writerune(1, (Rune) from);
150 bc7cb1a1 2003-11-23 devnull }
151 bc7cb1a1 2003-11-23 devnull }
152 bc7cb1a1 2003-11-23 devnull wflush(1);
153 bc7cb1a1 2003-11-23 devnull }
154 bc7cb1a1 2003-11-23 devnull
155 bc7cb1a1 2003-11-23 devnull void
156 bc7cb1a1 2003-11-23 devnull translit(void)
157 bc7cb1a1 2003-11-23 devnull {
158 bc7cb1a1 2003-11-23 devnull Rune *p;
159 bc7cb1a1 2003-11-23 devnull int i;
160 bc7cb1a1 2003-11-23 devnull long from, to, lastc, high;
161 bc7cb1a1 2003-11-23 devnull
162 bc7cb1a1 2003-11-23 devnull lastc = 0;
163 bc7cb1a1 2003-11-23 devnull high = 0;
164 bc7cb1a1 2003-11-23 devnull while ((from = canon(&pfrom)) >= 0)
165 bc7cb1a1 2003-11-23 devnull if (from > high) high = from;
166 bc7cb1a1 2003-11-23 devnull Prewind(&pfrom);
167 bc7cb1a1 2003-11-23 devnull if ((p = (Rune *) malloc((high+1)*sizeof(Rune))) == 0)
168 bc7cb1a1 2003-11-23 devnull error("can't allocate memory");
169 bc7cb1a1 2003-11-23 devnull for (i = 0; i <= high; i++)
170 bc7cb1a1 2003-11-23 devnull p[i] = i;
171 bc7cb1a1 2003-11-23 devnull while ((from = canon(&pfrom)) >= 0) {
172 bc7cb1a1 2003-11-23 devnull if ((to = canon(&pto)) < 0)
173 bc7cb1a1 2003-11-23 devnull to = lastc;
174 bc7cb1a1 2003-11-23 devnull else lastc = to;
175 bc7cb1a1 2003-11-23 devnull if (BITSET(f,from) && p[from] != to)
176 bc7cb1a1 2003-11-23 devnull error("ambiguous translation");
177 bc7cb1a1 2003-11-23 devnull SETBIT(f,from);
178 bc7cb1a1 2003-11-23 devnull p[from] = to;
179 bc7cb1a1 2003-11-23 devnull SETBIT(t,to);
180 bc7cb1a1 2003-11-23 devnull }
181 bc7cb1a1 2003-11-23 devnull while ((to = canon(&pto)) >= 0) {
182 bc7cb1a1 2003-11-23 devnull SETBIT(t,to);
183 bc7cb1a1 2003-11-23 devnull }
184 bc7cb1a1 2003-11-23 devnull if (sflag){
185 3e899d02 2011-01-02 rsc lastc = Runemax+1;
186 bc7cb1a1 2003-11-23 devnull while (readrune(0, &from) > 0) {
187 bc7cb1a1 2003-11-23 devnull if (from <= high)
188 bc7cb1a1 2003-11-23 devnull from = p[from];
189 bc7cb1a1 2003-11-23 devnull if (from != lastc || !BITSET(t,from)) {
190 bc7cb1a1 2003-11-23 devnull lastc = from;
191 bc7cb1a1 2003-11-23 devnull writerune(1, (Rune) from);
192 bc7cb1a1 2003-11-23 devnull }
193 bc7cb1a1 2003-11-23 devnull }
194 fa325e9b 2020-01-10 cross
195 bc7cb1a1 2003-11-23 devnull } else {
196 bc7cb1a1 2003-11-23 devnull while (readrune(0, &from) > 0) {
197 bc7cb1a1 2003-11-23 devnull if (from <= high)
198 bc7cb1a1 2003-11-23 devnull from = p[from];
199 bc7cb1a1 2003-11-23 devnull writerune(1, (Rune) from);
200 bc7cb1a1 2003-11-23 devnull }
201 bc7cb1a1 2003-11-23 devnull }
202 bc7cb1a1 2003-11-23 devnull wflush(1);
203 bc7cb1a1 2003-11-23 devnull }
204 bc7cb1a1 2003-11-23 devnull
205 bc7cb1a1 2003-11-23 devnull int
206 bc7cb1a1 2003-11-23 devnull readrune(int fd, long *rp)
207 bc7cb1a1 2003-11-23 devnull {
208 bc7cb1a1 2003-11-23 devnull Rune r;
209 bc7cb1a1 2003-11-23 devnull int j;
210 bc7cb1a1 2003-11-23 devnull static int i, n;
211 bc7cb1a1 2003-11-23 devnull static char buf[4096];
212 bc7cb1a1 2003-11-23 devnull
213 bc7cb1a1 2003-11-23 devnull j = i;
214 bc7cb1a1 2003-11-23 devnull for (;;) {
215 bc7cb1a1 2003-11-23 devnull if (i >= n) {
216 bc7cb1a1 2003-11-23 devnull wflush(1);
217 bc7cb1a1 2003-11-23 devnull if (j != i)
218 bc7cb1a1 2003-11-23 devnull memcpy(buf, buf+j, n-j);
219 bc7cb1a1 2003-11-23 devnull i = n-j;
220 bc7cb1a1 2003-11-23 devnull n = read(fd, &buf[i], sizeof(buf)-i);
221 bc7cb1a1 2003-11-23 devnull if (n < 0)
222 bc7cb1a1 2003-11-23 devnull error("read error");
223 bc7cb1a1 2003-11-23 devnull if (n == 0)
224 bc7cb1a1 2003-11-23 devnull return 0;
225 bc7cb1a1 2003-11-23 devnull j = 0;
226 bc7cb1a1 2003-11-23 devnull n += i;
227 bc7cb1a1 2003-11-23 devnull }
228 bc7cb1a1 2003-11-23 devnull i++;
229 bc7cb1a1 2003-11-23 devnull if (fullrune(&buf[j], i-j))
230 bc7cb1a1 2003-11-23 devnull break;
231 bc7cb1a1 2003-11-23 devnull }
232 bc7cb1a1 2003-11-23 devnull chartorune(&r, &buf[j]);
233 bc7cb1a1 2003-11-23 devnull *rp = r;
234 bc7cb1a1 2003-11-23 devnull return 1;
235 bc7cb1a1 2003-11-23 devnull }
236 bc7cb1a1 2003-11-23 devnull
237 bc7cb1a1 2003-11-23 devnull void
238 bc7cb1a1 2003-11-23 devnull writerune(int fd, Rune r)
239 bc7cb1a1 2003-11-23 devnull {
240 bc7cb1a1 2003-11-23 devnull char buf[UTFmax];
241 bc7cb1a1 2003-11-23 devnull int n;
242 bc7cb1a1 2003-11-23 devnull
243 bc7cb1a1 2003-11-23 devnull if (!wptr)
244 bc7cb1a1 2003-11-23 devnull wptr = wbuf;
245 bc7cb1a1 2003-11-23 devnull n = runetochar(buf, (Rune*)&r);
246 bc7cb1a1 2003-11-23 devnull if (wptr+n >= wbuf+sizeof(wbuf))
247 bc7cb1a1 2003-11-23 devnull wflush(fd);
248 bc7cb1a1 2003-11-23 devnull memcpy(wptr, buf, n);
249 bc7cb1a1 2003-11-23 devnull wptr += n;
250 bc7cb1a1 2003-11-23 devnull }
251 bc7cb1a1 2003-11-23 devnull
252 bc7cb1a1 2003-11-23 devnull void
253 bc7cb1a1 2003-11-23 devnull wflush(int fd)
254 bc7cb1a1 2003-11-23 devnull {
255 bc7cb1a1 2003-11-23 devnull if (wptr && wptr > wbuf)
256 bc7cb1a1 2003-11-23 devnull if (write(fd, wbuf, wptr-wbuf) != wptr-wbuf)
257 bc7cb1a1 2003-11-23 devnull error("write error");
258 bc7cb1a1 2003-11-23 devnull wptr = wbuf;
259 bc7cb1a1 2003-11-23 devnull }
260 bc7cb1a1 2003-11-23 devnull
261 bc7cb1a1 2003-11-23 devnull char *
262 bc7cb1a1 2003-11-23 devnull getrune(char *s, Rune *rp)
263 bc7cb1a1 2003-11-23 devnull {
264 bc7cb1a1 2003-11-23 devnull Rune r;
265 bc7cb1a1 2003-11-23 devnull char *save;
266 bc7cb1a1 2003-11-23 devnull int i, n;
267 bc7cb1a1 2003-11-23 devnull
268 bc7cb1a1 2003-11-23 devnull s += chartorune(rp, s);
269 bc7cb1a1 2003-11-23 devnull if((r = *rp) == '\\' && *s){
270 bc7cb1a1 2003-11-23 devnull n = 0;
271 bc7cb1a1 2003-11-23 devnull if (*s == 'x') {
272 bc7cb1a1 2003-11-23 devnull s++;
273 bc7cb1a1 2003-11-23 devnull for (i = 0; i < 4; i++) {
274 bc7cb1a1 2003-11-23 devnull save = s;
275 bc7cb1a1 2003-11-23 devnull s += chartorune(&r, s);
276 bc7cb1a1 2003-11-23 devnull if ('0' <= r && r <= '9')
277 bc7cb1a1 2003-11-23 devnull n = 16*n + r - '0';
278 bc7cb1a1 2003-11-23 devnull else if ('a' <= r && r <= 'f')
279 bc7cb1a1 2003-11-23 devnull n = 16*n + r - 'a' + 10;
280 bc7cb1a1 2003-11-23 devnull else if ('A' <= r && r <= 'F')
281 bc7cb1a1 2003-11-23 devnull n = 16*n + r - 'A' + 10;
282 bc7cb1a1 2003-11-23 devnull else {
283 bc7cb1a1 2003-11-23 devnull if (i == 0)
284 bc7cb1a1 2003-11-23 devnull *rp = 'x';
285 bc7cb1a1 2003-11-23 devnull else *rp = n;
286 bc7cb1a1 2003-11-23 devnull return save;
287 bc7cb1a1 2003-11-23 devnull }
288 bc7cb1a1 2003-11-23 devnull }
289 bc7cb1a1 2003-11-23 devnull } else {
290 bc7cb1a1 2003-11-23 devnull for(i = 0; i < 3; i++) {
291 bc7cb1a1 2003-11-23 devnull save = s;
292 bc7cb1a1 2003-11-23 devnull s += chartorune(&r, s);
293 bc7cb1a1 2003-11-23 devnull if('0' <= r && r <= '7')
294 bc7cb1a1 2003-11-23 devnull n = 8*n + r - '0';
295 bc7cb1a1 2003-11-23 devnull else {
296 bc7cb1a1 2003-11-23 devnull if (i == 0)
297 bc7cb1a1 2003-11-23 devnull {
298 bc7cb1a1 2003-11-23 devnull *rp = r;
299 bc7cb1a1 2003-11-23 devnull return s;
300 bc7cb1a1 2003-11-23 devnull }
301 bc7cb1a1 2003-11-23 devnull *rp = n;
302 bc7cb1a1 2003-11-23 devnull return save;
303 bc7cb1a1 2003-11-23 devnull }
304 bc7cb1a1 2003-11-23 devnull }
305 bc7cb1a1 2003-11-23 devnull if(n > 0377)
306 bc7cb1a1 2003-11-23 devnull error("char>0377");
307 bc7cb1a1 2003-11-23 devnull }
308 bc7cb1a1 2003-11-23 devnull *rp = n;
309 bc7cb1a1 2003-11-23 devnull }
310 bc7cb1a1 2003-11-23 devnull return s;
311 bc7cb1a1 2003-11-23 devnull }
312 bc7cb1a1 2003-11-23 devnull
313 bc7cb1a1 2003-11-23 devnull long
314 bc7cb1a1 2003-11-23 devnull canon(Pcb *p)
315 bc7cb1a1 2003-11-23 devnull {
316 bc7cb1a1 2003-11-23 devnull Rune r;
317 bc7cb1a1 2003-11-23 devnull
318 bc7cb1a1 2003-11-23 devnull if (p->final >= 0) {
319 bc7cb1a1 2003-11-23 devnull if (p->last < p->final)
320 bc7cb1a1 2003-11-23 devnull return ++p->last;
321 bc7cb1a1 2003-11-23 devnull p->final = -1;
322 bc7cb1a1 2003-11-23 devnull }
323 bc7cb1a1 2003-11-23 devnull if (*p->current == '\0')
324 bc7cb1a1 2003-11-23 devnull return -1;
325 bc7cb1a1 2003-11-23 devnull if(*p->current == '-' && p->last >= 0 && p->current[1]){
326 bc7cb1a1 2003-11-23 devnull p->current = getrune(p->current+1, &r);
327 bc7cb1a1 2003-11-23 devnull if (r < p->last)
328 bc7cb1a1 2003-11-23 devnull error ("Invalid range specification");
329 bc7cb1a1 2003-11-23 devnull if (r > p->last) {
330 bc7cb1a1 2003-11-23 devnull p->final = r;
331 bc7cb1a1 2003-11-23 devnull return ++p->last;
332 bc7cb1a1 2003-11-23 devnull }
333 bc7cb1a1 2003-11-23 devnull }
334 bc7cb1a1 2003-11-23 devnull p->current = getrune(p->current, &r);
335 bc7cb1a1 2003-11-23 devnull p->last = r;
336 bc7cb1a1 2003-11-23 devnull return p->last;
337 bc7cb1a1 2003-11-23 devnull }
338 bc7cb1a1 2003-11-23 devnull
339 bc7cb1a1 2003-11-23 devnull void
340 bc7cb1a1 2003-11-23 devnull Pinit(Pcb *p, char *cp)
341 bc7cb1a1 2003-11-23 devnull {
342 bc7cb1a1 2003-11-23 devnull p->current = p->base = cp;
343 bc7cb1a1 2003-11-23 devnull p->last = p->final = -1;
344 bc7cb1a1 2003-11-23 devnull }
345 bc7cb1a1 2003-11-23 devnull void
346 bc7cb1a1 2003-11-23 devnull Prewind(Pcb *p)
347 bc7cb1a1 2003-11-23 devnull {
348 bc7cb1a1 2003-11-23 devnull p->current = p->base;
349 bc7cb1a1 2003-11-23 devnull p->last = p->final = -1;
350 bc7cb1a1 2003-11-23 devnull }
351 bc7cb1a1 2003-11-23 devnull void
352 bc7cb1a1 2003-11-23 devnull error(char *s)
353 bc7cb1a1 2003-11-23 devnull {
354 bc7cb1a1 2003-11-23 devnull fprint(2, "%s: %s\n", argv0, s);
355 bc7cb1a1 2003-11-23 devnull exits(s);
356 bc7cb1a1 2003-11-23 devnull }