4 bc7cb1a1 2003-11-23 devnull #include <u.h>
5 bc7cb1a1 2003-11-23 devnull #include <libc.h>
6 bc7cb1a1 2003-11-23 devnull #include <bio.h>
7 bc7cb1a1 2003-11-23 devnull #include <regexp.h>
9 6b2d0fd9 2004-03-26 devnull #undef EOF /* stdio? */
13 bc7cb1a1 2003-11-23 devnull FNSIZE = 128, /* file name */
14 bc7cb1a1 2003-11-23 devnull LBSIZE = 4096, /* max line size */
15 bc7cb1a1 2003-11-23 devnull BLKSIZE = 4096, /* block size in temp file */
16 bc7cb1a1 2003-11-23 devnull NBLK = 8191, /* max size of temp file */
17 bc7cb1a1 2003-11-23 devnull ESIZE = 256, /* max size of reg exp */
18 bc7cb1a1 2003-11-23 devnull GBSIZE = 256, /* max size of global command */
19 bc7cb1a1 2003-11-23 devnull MAXSUB = 9, /* max number of sub reg exp */
20 bc7cb1a1 2003-11-23 devnull ESCFLG = 0xFFFF, /* escape Rune - user defined code */
24 bc7cb1a1 2003-11-23 devnull void (*oldhup)(int);
25 bc7cb1a1 2003-11-23 devnull void (*oldquit)(int);
26 bc7cb1a1 2003-11-23 devnull int* addr1;
27 bc7cb1a1 2003-11-23 devnull int* addr2;
28 bc7cb1a1 2003-11-23 devnull int anymarks;
30 bc7cb1a1 2003-11-23 devnull long count;
31 bc7cb1a1 2003-11-23 devnull int* dol;
32 bc7cb1a1 2003-11-23 devnull int* dot;
33 bc7cb1a1 2003-11-23 devnull int fchange;
34 bc7cb1a1 2003-11-23 devnull char file[FNSIZE];
35 bc7cb1a1 2003-11-23 devnull Rune genbuf[LBSIZE];
36 bc7cb1a1 2003-11-23 devnull int given;
37 bc7cb1a1 2003-11-23 devnull Rune* globp;
38 bc7cb1a1 2003-11-23 devnull int iblock;
39 bc7cb1a1 2003-11-23 devnull int ichanged;
41 bc7cb1a1 2003-11-23 devnull Biobuf iobuf;
42 bc7cb1a1 2003-11-23 devnull int lastc;
43 bc7cb1a1 2003-11-23 devnull char line[70];
44 bc7cb1a1 2003-11-23 devnull Rune* linebp;
45 bc7cb1a1 2003-11-23 devnull Rune linebuf[LBSIZE];
46 bc7cb1a1 2003-11-23 devnull int listf;
47 bc7cb1a1 2003-11-23 devnull int listn;
48 bc7cb1a1 2003-11-23 devnull Rune* loc1;
49 bc7cb1a1 2003-11-23 devnull Rune* loc2;
50 bc7cb1a1 2003-11-23 devnull int names[26];
51 bc7cb1a1 2003-11-23 devnull int nleft;
52 bc7cb1a1 2003-11-23 devnull int oblock;
53 bc7cb1a1 2003-11-23 devnull int oflag;
54 bc7cb1a1 2003-11-23 devnull Reprog *pattern;
55 bc7cb1a1 2003-11-23 devnull int peekc;
56 bc7cb1a1 2003-11-23 devnull int pflag;
57 bc7cb1a1 2003-11-23 devnull int rescuing;
58 bc7cb1a1 2003-11-23 devnull Rune rhsbuf[LBSIZE/2];
59 bc7cb1a1 2003-11-23 devnull char savedfile[FNSIZE];
60 bc7cb1a1 2003-11-23 devnull jmp_buf savej;
61 bc7cb1a1 2003-11-23 devnull int subnewa;
62 bc7cb1a1 2003-11-23 devnull int subolda;
63 bc7cb1a1 2003-11-23 devnull Resub subexp[MAXSUB];
64 bc7cb1a1 2003-11-23 devnull char* tfname;
65 bc7cb1a1 2003-11-23 devnull int tline;
66 bc7cb1a1 2003-11-23 devnull int waiting;
67 bc7cb1a1 2003-11-23 devnull int wrapp;
68 bc7cb1a1 2003-11-23 devnull int* zero;
70 bc7cb1a1 2003-11-23 devnull char Q[] = "";
71 bc7cb1a1 2003-11-23 devnull char T[] = "TMP";
72 bc7cb1a1 2003-11-23 devnull char WRERR[] = "WRITE ERROR";
73 bc7cb1a1 2003-11-23 devnull int bpagesize = 20;
74 bc7cb1a1 2003-11-23 devnull char hex[] = "0123456789abcdef";
75 bc7cb1a1 2003-11-23 devnull char* linp = line;
76 bc7cb1a1 2003-11-23 devnull ulong nlall = 128;
77 bc7cb1a1 2003-11-23 devnull int tfile = -1;
78 bc7cb1a1 2003-11-23 devnull int vflag = 1;
80 bc7cb1a1 2003-11-23 devnull void add(int);
81 bc7cb1a1 2003-11-23 devnull int* address(void);
82 bc7cb1a1 2003-11-23 devnull int append(int(*)(void), int*);
83 bc7cb1a1 2003-11-23 devnull void browse(void);
84 bc7cb1a1 2003-11-23 devnull void callunix(void);
85 bc7cb1a1 2003-11-23 devnull void commands(void);
86 bc7cb1a1 2003-11-23 devnull void compile(int);
87 bc7cb1a1 2003-11-23 devnull int compsub(void);
88 bc7cb1a1 2003-11-23 devnull void dosub(void);
89 bc7cb1a1 2003-11-23 devnull void error(char*);
90 bc7cb1a1 2003-11-23 devnull int match(int*);
91 bc7cb1a1 2003-11-23 devnull void exfile(int);
92 bc7cb1a1 2003-11-23 devnull void filename(int);
93 bc7cb1a1 2003-11-23 devnull Rune* getblock(int, int);
94 bc7cb1a1 2003-11-23 devnull int getchr(void);
95 bc7cb1a1 2003-11-23 devnull int getcopy(void);
96 bc7cb1a1 2003-11-23 devnull int getfile(void);
97 bc7cb1a1 2003-11-23 devnull Rune* getline(int);
98 bc7cb1a1 2003-11-23 devnull int getnum(void);
99 bc7cb1a1 2003-11-23 devnull int getsub(void);
100 bc7cb1a1 2003-11-23 devnull int gettty(void);
101 bc7cb1a1 2003-11-23 devnull void global(int);
102 bc7cb1a1 2003-11-23 devnull void init(void);
103 bc7cb1a1 2003-11-23 devnull void join(void);
104 bc7cb1a1 2003-11-23 devnull void move(int);
105 bc7cb1a1 2003-11-23 devnull void newline(void);
106 bc7cb1a1 2003-11-23 devnull void nonzero(void);
107 bc7cb1a1 2003-11-23 devnull void notifyf(void*, char*);
108 bc7cb1a1 2003-11-23 devnull Rune* place(Rune*, Rune*, Rune*);
109 bc7cb1a1 2003-11-23 devnull void printcom(void);
110 bc7cb1a1 2003-11-23 devnull void putchr(int);
111 bc7cb1a1 2003-11-23 devnull void putd(void);
112 bc7cb1a1 2003-11-23 devnull void putfile(void);
113 bc7cb1a1 2003-11-23 devnull int putline(void);
114 bc7cb1a1 2003-11-23 devnull void putshst(Rune*);
115 bc7cb1a1 2003-11-23 devnull void putst(char*);
116 bc7cb1a1 2003-11-23 devnull void quit(void);
117 bc7cb1a1 2003-11-23 devnull void rdelete(int*, int*);
118 bc7cb1a1 2003-11-23 devnull void regerror(char *);
119 bc7cb1a1 2003-11-23 devnull void reverse(int*, int*);
120 bc7cb1a1 2003-11-23 devnull void setnoaddr(void);
121 bc7cb1a1 2003-11-23 devnull void setwide(void);
122 bc7cb1a1 2003-11-23 devnull void squeeze(int);
123 bc7cb1a1 2003-11-23 devnull void substitute(int);
125 bc7cb1a1 2003-11-23 devnull Rune La[] = { 'a', 0 };
126 bc7cb1a1 2003-11-23 devnull Rune Lr[] = { 'r', 0 };
128 90c3dab6 2006-07-23 devnull char tmp[] = "/var/tmp/eXXXXX";
131 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
133 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
135 bc7cb1a1 2003-11-23 devnull notify(notifyf);
136 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
137 bc7cb1a1 2003-11-23 devnull case 'o':
138 bc7cb1a1 2003-11-23 devnull oflag = 1;
139 bc7cb1a1 2003-11-23 devnull vflag = 0;
141 bc7cb1a1 2003-11-23 devnull } ARGEND
143 bc7cb1a1 2003-11-23 devnull USED(argc);
144 bc7cb1a1 2003-11-23 devnull if(*argv && (strcmp(*argv, "-") == 0)) {
146 bc7cb1a1 2003-11-23 devnull vflag = 0;
148 bc7cb1a1 2003-11-23 devnull if(oflag) {
149 c8b6342d 2005-01-13 devnull p1 = "/dev/stdout";
150 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
151 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
153 bc7cb1a1 2003-11-23 devnull globp = La;
155 bc7cb1a1 2003-11-23 devnull if(*argv) {
156 bc7cb1a1 2003-11-23 devnull p1 = *argv;
157 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
158 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
159 bc7cb1a1 2003-11-23 devnull if(p2 >= &savedfile[sizeof(savedfile)])
161 bc7cb1a1 2003-11-23 devnull globp = Lr;
163 bc7cb1a1 2003-11-23 devnull zero = malloc((nlall+5)*sizeof(int*));
164 bc7cb1a1 2003-11-23 devnull tfname = mktemp(tmp);
166 bc7cb1a1 2003-11-23 devnull setjmp(savej);
167 bc7cb1a1 2003-11-23 devnull commands();
172 bc7cb1a1 2003-11-23 devnull commands(void)
174 bc7cb1a1 2003-11-23 devnull int *a1, c, temp;
175 bc7cb1a1 2003-11-23 devnull char lastsep;
178 bc7cb1a1 2003-11-23 devnull for(;;) {
179 bc7cb1a1 2003-11-23 devnull if(pflag) {
180 bc7cb1a1 2003-11-23 devnull pflag = 0;
181 bc7cb1a1 2003-11-23 devnull addr1 = addr2 = dot;
182 bc7cb1a1 2003-11-23 devnull printcom();
184 bc7cb1a1 2003-11-23 devnull c = '\n';
185 bc7cb1a1 2003-11-23 devnull for(addr1 = 0;;) {
186 bc7cb1a1 2003-11-23 devnull lastsep = c;
187 bc7cb1a1 2003-11-23 devnull a1 = address();
188 bc7cb1a1 2003-11-23 devnull c = getchr();
189 bc7cb1a1 2003-11-23 devnull if(c != ',' && c != ';')
191 bc7cb1a1 2003-11-23 devnull if(lastsep == ',')
192 bc7cb1a1 2003-11-23 devnull error(Q);
193 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
194 bc7cb1a1 2003-11-23 devnull a1 = zero+1;
195 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
198 bc7cb1a1 2003-11-23 devnull addr1 = a1;
199 bc7cb1a1 2003-11-23 devnull if(c == ';')
200 bc7cb1a1 2003-11-23 devnull dot = a1;
202 bc7cb1a1 2003-11-23 devnull if(lastsep != '\n' && a1 == 0)
203 bc7cb1a1 2003-11-23 devnull a1 = dol;
204 bc7cb1a1 2003-11-23 devnull if((addr2=a1) == 0) {
205 bc7cb1a1 2003-11-23 devnull given = 0;
206 bc7cb1a1 2003-11-23 devnull addr2 = dot;
208 bc7cb1a1 2003-11-23 devnull given = 1;
209 bc7cb1a1 2003-11-23 devnull if(addr1 == 0)
210 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
211 bc7cb1a1 2003-11-23 devnull switch(c) {
213 bc7cb1a1 2003-11-23 devnull case 'a':
215 bc7cb1a1 2003-11-23 devnull continue;
217 bc7cb1a1 2003-11-23 devnull case 'b':
218 bc7cb1a1 2003-11-23 devnull nonzero();
219 bc7cb1a1 2003-11-23 devnull browse();
220 bc7cb1a1 2003-11-23 devnull continue;
222 bc7cb1a1 2003-11-23 devnull case 'c':
223 bc7cb1a1 2003-11-23 devnull nonzero();
224 bc7cb1a1 2003-11-23 devnull newline();
225 bc7cb1a1 2003-11-23 devnull rdelete(addr1, addr2);
226 bc7cb1a1 2003-11-23 devnull append(gettty, addr1-1);
227 bc7cb1a1 2003-11-23 devnull continue;
229 bc7cb1a1 2003-11-23 devnull case 'd':
230 bc7cb1a1 2003-11-23 devnull nonzero();
231 bc7cb1a1 2003-11-23 devnull newline();
232 bc7cb1a1 2003-11-23 devnull rdelete(addr1, addr2);
233 bc7cb1a1 2003-11-23 devnull continue;
235 bc7cb1a1 2003-11-23 devnull case 'E':
236 bc7cb1a1 2003-11-23 devnull fchange = 0;
237 bc7cb1a1 2003-11-23 devnull c = 'e';
238 bc7cb1a1 2003-11-23 devnull case 'e':
239 bc7cb1a1 2003-11-23 devnull setnoaddr();
240 bc7cb1a1 2003-11-23 devnull if(vflag && fchange) {
241 bc7cb1a1 2003-11-23 devnull fchange = 0;
242 bc7cb1a1 2003-11-23 devnull error(Q);
244 bc7cb1a1 2003-11-23 devnull filename(c);
246 bc7cb1a1 2003-11-23 devnull addr2 = zero;
247 bc7cb1a1 2003-11-23 devnull goto caseread;
249 bc7cb1a1 2003-11-23 devnull case 'f':
250 bc7cb1a1 2003-11-23 devnull setnoaddr();
251 bc7cb1a1 2003-11-23 devnull filename(c);
252 bc7cb1a1 2003-11-23 devnull putst(savedfile);
253 bc7cb1a1 2003-11-23 devnull continue;
255 bc7cb1a1 2003-11-23 devnull case 'g':
256 bc7cb1a1 2003-11-23 devnull global(1);
257 bc7cb1a1 2003-11-23 devnull continue;
259 bc7cb1a1 2003-11-23 devnull case 'i':
260 bc7cb1a1 2003-11-23 devnull add(-1);
261 bc7cb1a1 2003-11-23 devnull continue;
264 bc7cb1a1 2003-11-23 devnull case 'j':
265 bc7cb1a1 2003-11-23 devnull if(!given)
266 bc7cb1a1 2003-11-23 devnull addr2++;
267 bc7cb1a1 2003-11-23 devnull newline();
269 bc7cb1a1 2003-11-23 devnull continue;
271 bc7cb1a1 2003-11-23 devnull case 'k':
272 bc7cb1a1 2003-11-23 devnull nonzero();
273 bc7cb1a1 2003-11-23 devnull c = getchr();
274 bc7cb1a1 2003-11-23 devnull if(c < 'a' || c > 'z')
275 bc7cb1a1 2003-11-23 devnull error(Q);
276 bc7cb1a1 2003-11-23 devnull newline();
277 bc7cb1a1 2003-11-23 devnull names[c-'a'] = *addr2 & ~01;
278 bc7cb1a1 2003-11-23 devnull anymarks |= 01;
279 bc7cb1a1 2003-11-23 devnull continue;
281 bc7cb1a1 2003-11-23 devnull case 'm':
282 bc7cb1a1 2003-11-23 devnull move(0);
283 bc7cb1a1 2003-11-23 devnull continue;
285 bc7cb1a1 2003-11-23 devnull case 'n':
286 bc7cb1a1 2003-11-23 devnull listn++;
287 bc7cb1a1 2003-11-23 devnull newline();
288 bc7cb1a1 2003-11-23 devnull printcom();
289 bc7cb1a1 2003-11-23 devnull continue;
291 bc7cb1a1 2003-11-23 devnull case '\n':
292 bc7cb1a1 2003-11-23 devnull if(a1==0) {
293 bc7cb1a1 2003-11-23 devnull a1 = dot+1;
294 bc7cb1a1 2003-11-23 devnull addr2 = a1;
295 bc7cb1a1 2003-11-23 devnull addr1 = a1;
297 bc7cb1a1 2003-11-23 devnull if(lastsep==';')
298 bc7cb1a1 2003-11-23 devnull addr1 = a1;
299 bc7cb1a1 2003-11-23 devnull printcom();
300 bc7cb1a1 2003-11-23 devnull continue;
302 bc7cb1a1 2003-11-23 devnull case 'l':
303 bc7cb1a1 2003-11-23 devnull listf++;
304 bc7cb1a1 2003-11-23 devnull case 'p':
305 bc7cb1a1 2003-11-23 devnull case 'P':
306 bc7cb1a1 2003-11-23 devnull newline();
307 bc7cb1a1 2003-11-23 devnull printcom();
308 bc7cb1a1 2003-11-23 devnull continue;
310 bc7cb1a1 2003-11-23 devnull case 'Q':
311 bc7cb1a1 2003-11-23 devnull fchange = 0;
312 bc7cb1a1 2003-11-23 devnull case 'q':
313 bc7cb1a1 2003-11-23 devnull setnoaddr();
314 bc7cb1a1 2003-11-23 devnull newline();
317 bc7cb1a1 2003-11-23 devnull case 'r':
318 bc7cb1a1 2003-11-23 devnull filename(c);
319 bc7cb1a1 2003-11-23 devnull caseread:
320 bc7cb1a1 2003-11-23 devnull if((io=open(file, OREAD)) < 0) {
321 bc7cb1a1 2003-11-23 devnull lastc = '\n';
322 bc7cb1a1 2003-11-23 devnull error(file);
324 bc7cb1a1 2003-11-23 devnull if((d = dirfstat(io)) != nil){
325 bc7cb1a1 2003-11-23 devnull if(d->mode & DMAPPEND)
326 bc7cb1a1 2003-11-23 devnull print("warning: %s is append only\n", file);
327 bc7cb1a1 2003-11-23 devnull free(d);
329 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OREAD);
330 bc7cb1a1 2003-11-23 devnull setwide();
331 bc7cb1a1 2003-11-23 devnull squeeze(0);
332 bc7cb1a1 2003-11-23 devnull c = zero != dol;
333 bc7cb1a1 2003-11-23 devnull append(getfile, addr2);
334 bc7cb1a1 2003-11-23 devnull exfile(OREAD);
336 bc7cb1a1 2003-11-23 devnull fchange = c;
337 bc7cb1a1 2003-11-23 devnull continue;
339 bc7cb1a1 2003-11-23 devnull case 's':
340 bc7cb1a1 2003-11-23 devnull nonzero();
341 bc7cb1a1 2003-11-23 devnull substitute(globp != 0);
342 bc7cb1a1 2003-11-23 devnull continue;
344 bc7cb1a1 2003-11-23 devnull case 't':
345 bc7cb1a1 2003-11-23 devnull move(1);
346 bc7cb1a1 2003-11-23 devnull continue;
348 bc7cb1a1 2003-11-23 devnull case 'u':
349 bc7cb1a1 2003-11-23 devnull nonzero();
350 bc7cb1a1 2003-11-23 devnull newline();
351 bc7cb1a1 2003-11-23 devnull if((*addr2&~01) != subnewa)
352 bc7cb1a1 2003-11-23 devnull error(Q);
353 bc7cb1a1 2003-11-23 devnull *addr2 = subolda;
354 bc7cb1a1 2003-11-23 devnull dot = addr2;
355 bc7cb1a1 2003-11-23 devnull continue;
357 bc7cb1a1 2003-11-23 devnull case 'v':
358 bc7cb1a1 2003-11-23 devnull global(0);
359 bc7cb1a1 2003-11-23 devnull continue;
361 bc7cb1a1 2003-11-23 devnull case 'W':
362 bc7cb1a1 2003-11-23 devnull wrapp++;
363 bc7cb1a1 2003-11-23 devnull case 'w':
364 bc7cb1a1 2003-11-23 devnull setwide();
365 bc7cb1a1 2003-11-23 devnull squeeze(dol>zero);
366 bc7cb1a1 2003-11-23 devnull temp = getchr();
367 bc7cb1a1 2003-11-23 devnull if(temp != 'q' && temp != 'Q') {
368 bc7cb1a1 2003-11-23 devnull peekc = temp;
369 bc7cb1a1 2003-11-23 devnull temp = 0;
371 bc7cb1a1 2003-11-23 devnull filename(c);
372 bc7cb1a1 2003-11-23 devnull if(!wrapp ||
373 bc7cb1a1 2003-11-23 devnull ((io = open(file, OWRITE)) == -1) ||
374 bc7cb1a1 2003-11-23 devnull ((seek(io, 0L, 2)) == -1))
375 bc7cb1a1 2003-11-23 devnull if((io = create(file, OWRITE, 0666)) < 0)
376 bc7cb1a1 2003-11-23 devnull error(file);
377 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OWRITE);
378 bc7cb1a1 2003-11-23 devnull wrapp = 0;
379 bc7cb1a1 2003-11-23 devnull if(dol > zero)
380 bc7cb1a1 2003-11-23 devnull putfile();
381 bc7cb1a1 2003-11-23 devnull exfile(OWRITE);
382 bc7cb1a1 2003-11-23 devnull if(addr1<=zero+1 && addr2==dol)
383 bc7cb1a1 2003-11-23 devnull fchange = 0;
384 bc7cb1a1 2003-11-23 devnull if(temp == 'Q')
385 bc7cb1a1 2003-11-23 devnull fchange = 0;
386 bc7cb1a1 2003-11-23 devnull if(temp)
388 bc7cb1a1 2003-11-23 devnull continue;
390 bc7cb1a1 2003-11-23 devnull case '=':
391 bc7cb1a1 2003-11-23 devnull setwide();
392 bc7cb1a1 2003-11-23 devnull squeeze(0);
393 bc7cb1a1 2003-11-23 devnull newline();
394 bc7cb1a1 2003-11-23 devnull count = addr2 - zero;
396 bb0266fe 2005-05-07 devnull putchr('\n');
397 bc7cb1a1 2003-11-23 devnull continue;
399 bc7cb1a1 2003-11-23 devnull case '!':
400 bc7cb1a1 2003-11-23 devnull callunix();
401 bc7cb1a1 2003-11-23 devnull continue;
403 bc7cb1a1 2003-11-23 devnull case EOF:
407 bc7cb1a1 2003-11-23 devnull error(Q);
412 bc7cb1a1 2003-11-23 devnull printcom(void)
414 bc7cb1a1 2003-11-23 devnull int *a1;
416 bc7cb1a1 2003-11-23 devnull nonzero();
417 bc7cb1a1 2003-11-23 devnull a1 = addr1;
419 bc7cb1a1 2003-11-23 devnull if(listn) {
420 bc7cb1a1 2003-11-23 devnull count = a1-zero;
422 bb0266fe 2005-05-07 devnull putchr('\t');
424 bc7cb1a1 2003-11-23 devnull putshst(getline(*a1++));
425 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
426 bc7cb1a1 2003-11-23 devnull dot = addr2;
427 bc7cb1a1 2003-11-23 devnull listf = 0;
428 bc7cb1a1 2003-11-23 devnull listn = 0;
429 bc7cb1a1 2003-11-23 devnull pflag = 0;
433 bc7cb1a1 2003-11-23 devnull address(void)
435 bc7cb1a1 2003-11-23 devnull int sign, *a, opcnt, nextopand, *b, c;
437 bc7cb1a1 2003-11-23 devnull nextopand = -1;
438 bc7cb1a1 2003-11-23 devnull sign = 1;
439 bc7cb1a1 2003-11-23 devnull opcnt = 0;
440 bc7cb1a1 2003-11-23 devnull a = dot;
443 bc7cb1a1 2003-11-23 devnull c = getchr();
444 bc7cb1a1 2003-11-23 devnull } while(c == ' ' || c == '\t');
445 bc7cb1a1 2003-11-23 devnull if(c >= '0' && c <= '9') {
446 bc7cb1a1 2003-11-23 devnull peekc = c;
447 bc7cb1a1 2003-11-23 devnull if(!opcnt)
448 bc7cb1a1 2003-11-23 devnull a = zero;
449 bc7cb1a1 2003-11-23 devnull a += sign*getnum();
451 bc7cb1a1 2003-11-23 devnull switch(c) {
452 bc7cb1a1 2003-11-23 devnull case '$':
453 bc7cb1a1 2003-11-23 devnull a = dol;
454 bc7cb1a1 2003-11-23 devnull case '.':
455 bc7cb1a1 2003-11-23 devnull if(opcnt)
456 bc7cb1a1 2003-11-23 devnull error(Q);
458 bc7cb1a1 2003-11-23 devnull case '\'':
459 bc7cb1a1 2003-11-23 devnull c = getchr();
460 bc7cb1a1 2003-11-23 devnull if(opcnt || c < 'a' || c > 'z')
461 bc7cb1a1 2003-11-23 devnull error(Q);
462 bc7cb1a1 2003-11-23 devnull a = zero;
465 bc7cb1a1 2003-11-23 devnull } while(a <= dol && names[c-'a'] != (*a & ~01));
467 bc7cb1a1 2003-11-23 devnull case '?':
468 bc7cb1a1 2003-11-23 devnull sign = -sign;
469 bc7cb1a1 2003-11-23 devnull case '/':
470 bc7cb1a1 2003-11-23 devnull compile(c);
472 bc7cb1a1 2003-11-23 devnull for(;;) {
473 bc7cb1a1 2003-11-23 devnull a += sign;
474 bc7cb1a1 2003-11-23 devnull if(a <= zero)
475 bc7cb1a1 2003-11-23 devnull a = dol;
476 bc7cb1a1 2003-11-23 devnull if(a > dol)
477 bc7cb1a1 2003-11-23 devnull a = zero;
478 bc7cb1a1 2003-11-23 devnull if(match(a))
480 bc7cb1a1 2003-11-23 devnull if(a == b)
481 bc7cb1a1 2003-11-23 devnull error(Q);
484 bc7cb1a1 2003-11-23 devnull default:
485 bc7cb1a1 2003-11-23 devnull if(nextopand == opcnt) {
486 bc7cb1a1 2003-11-23 devnull a += sign;
487 bc7cb1a1 2003-11-23 devnull if(a < zero || dol < a)
488 bc7cb1a1 2003-11-23 devnull continue; /* error(Q); */
490 bc7cb1a1 2003-11-23 devnull if(c != '+' && c != '-' && c != '^') {
491 bc7cb1a1 2003-11-23 devnull peekc = c;
492 bc7cb1a1 2003-11-23 devnull if(opcnt == 0)
494 bc7cb1a1 2003-11-23 devnull return a;
496 bc7cb1a1 2003-11-23 devnull sign = 1;
497 bc7cb1a1 2003-11-23 devnull if(c != '+')
498 bc7cb1a1 2003-11-23 devnull sign = -sign;
499 bc7cb1a1 2003-11-23 devnull nextopand = ++opcnt;
500 bc7cb1a1 2003-11-23 devnull continue;
502 bc7cb1a1 2003-11-23 devnull sign = 1;
503 bc7cb1a1 2003-11-23 devnull opcnt++;
504 bc7cb1a1 2003-11-23 devnull } while(zero <= a && a <= dol);
505 bc7cb1a1 2003-11-23 devnull error(Q);
506 bc7cb1a1 2003-11-23 devnull return 0;
510 bc7cb1a1 2003-11-23 devnull getnum(void)
512 bc7cb1a1 2003-11-23 devnull int r, c;
515 bc7cb1a1 2003-11-23 devnull for(;;) {
516 bc7cb1a1 2003-11-23 devnull c = getchr();
517 bc7cb1a1 2003-11-23 devnull if(c < '0' || c > '9')
519 bc7cb1a1 2003-11-23 devnull r = r*10 + (c-'0');
521 bc7cb1a1 2003-11-23 devnull peekc = c;
522 bc7cb1a1 2003-11-23 devnull return r;
526 bc7cb1a1 2003-11-23 devnull setwide(void)
528 bc7cb1a1 2003-11-23 devnull if(!given) {
529 bc7cb1a1 2003-11-23 devnull addr1 = zero + (dol>zero);
530 bc7cb1a1 2003-11-23 devnull addr2 = dol;
535 bc7cb1a1 2003-11-23 devnull setnoaddr(void)
537 bc7cb1a1 2003-11-23 devnull if(given)
538 bc7cb1a1 2003-11-23 devnull error(Q);
542 bc7cb1a1 2003-11-23 devnull nonzero(void)
544 bc7cb1a1 2003-11-23 devnull squeeze(1);
548 bc7cb1a1 2003-11-23 devnull squeeze(int i)
550 bc7cb1a1 2003-11-23 devnull if(addr1 < zero+i || addr2 > dol || addr1 > addr2)
551 bc7cb1a1 2003-11-23 devnull error(Q);
555 bc7cb1a1 2003-11-23 devnull newline(void)
559 bc7cb1a1 2003-11-23 devnull c = getchr();
560 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF)
562 bc7cb1a1 2003-11-23 devnull if(c == 'p' || c == 'l' || c == 'n') {
563 bc7cb1a1 2003-11-23 devnull pflag++;
564 bc7cb1a1 2003-11-23 devnull if(c == 'l')
565 bc7cb1a1 2003-11-23 devnull listf++;
567 bc7cb1a1 2003-11-23 devnull if(c == 'n')
568 bc7cb1a1 2003-11-23 devnull listn++;
569 bc7cb1a1 2003-11-23 devnull c = getchr();
570 bc7cb1a1 2003-11-23 devnull if(c == '\n')
573 bc7cb1a1 2003-11-23 devnull error(Q);
577 bc7cb1a1 2003-11-23 devnull filename(int comm)
579 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
580 bc7cb1a1 2003-11-23 devnull Rune rune;
583 bc7cb1a1 2003-11-23 devnull count = 0;
584 bc7cb1a1 2003-11-23 devnull c = getchr();
585 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF) {
586 bc7cb1a1 2003-11-23 devnull p1 = savedfile;
587 bc7cb1a1 2003-11-23 devnull if(*p1 == 0 && comm != 'f')
588 bc7cb1a1 2003-11-23 devnull error(Q);
589 bc7cb1a1 2003-11-23 devnull p2 = file;
590 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
594 bc7cb1a1 2003-11-23 devnull if(c != ' ')
595 bc7cb1a1 2003-11-23 devnull error(Q);
596 bc7cb1a1 2003-11-23 devnull while((c=getchr()) == ' ')
598 bc7cb1a1 2003-11-23 devnull if(c == '\n')
599 bc7cb1a1 2003-11-23 devnull error(Q);
600 bc7cb1a1 2003-11-23 devnull p1 = file;
602 bc7cb1a1 2003-11-23 devnull if(p1 >= &file[sizeof(file)-6] || c == ' ' || c == EOF)
603 bc7cb1a1 2003-11-23 devnull error(Q);
604 bc7cb1a1 2003-11-23 devnull rune = c;
605 bc7cb1a1 2003-11-23 devnull p1 += runetochar(p1, &rune);
606 bc7cb1a1 2003-11-23 devnull } while((c=getchr()) != '\n');
607 bc7cb1a1 2003-11-23 devnull *p1 = 0;
608 bc7cb1a1 2003-11-23 devnull if(savedfile[0] == 0 || comm == 'e' || comm == 'f') {
609 bc7cb1a1 2003-11-23 devnull p1 = savedfile;
610 bc7cb1a1 2003-11-23 devnull p2 = file;
611 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
617 bc7cb1a1 2003-11-23 devnull exfile(int om)
620 bc7cb1a1 2003-11-23 devnull if(om == OWRITE)
621 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
622 bc7cb1a1 2003-11-23 devnull error(Q);
623 bc7cb1a1 2003-11-23 devnull close(io);
624 bc7cb1a1 2003-11-23 devnull io = -1;
625 bc7cb1a1 2003-11-23 devnull if(vflag) {
627 bb0266fe 2005-05-07 devnull putchr('\n');
632 bc7cb1a1 2003-11-23 devnull error1(char *s)
636 bc7cb1a1 2003-11-23 devnull wrapp = 0;
637 bc7cb1a1 2003-11-23 devnull listf = 0;
638 bc7cb1a1 2003-11-23 devnull listn = 0;
639 bc7cb1a1 2003-11-23 devnull count = 0;
640 bc7cb1a1 2003-11-23 devnull seek(0, 0, 2);
641 bc7cb1a1 2003-11-23 devnull pflag = 0;
642 bc7cb1a1 2003-11-23 devnull if(globp)
643 bc7cb1a1 2003-11-23 devnull lastc = '\n';
644 bc7cb1a1 2003-11-23 devnull globp = 0;
645 bc7cb1a1 2003-11-23 devnull peekc = lastc;
646 bc7cb1a1 2003-11-23 devnull if(lastc)
647 bc7cb1a1 2003-11-23 devnull for(;;) {
648 bc7cb1a1 2003-11-23 devnull c = getchr();
649 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF)
652 bc7cb1a1 2003-11-23 devnull if(io > 0) {
653 bc7cb1a1 2003-11-23 devnull close(io);
654 bc7cb1a1 2003-11-23 devnull io = -1;
656 bb0266fe 2005-05-07 devnull putchr('?');
657 bc7cb1a1 2003-11-23 devnull putst(s);
661 bc7cb1a1 2003-11-23 devnull error(char *s)
663 bc7cb1a1 2003-11-23 devnull error1(s);
664 bc7cb1a1 2003-11-23 devnull longjmp(savej, 1);
668 bc7cb1a1 2003-11-23 devnull rescue(void)
670 bc7cb1a1 2003-11-23 devnull rescuing = 1;
671 bc7cb1a1 2003-11-23 devnull if(dol > zero) {
672 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
673 bc7cb1a1 2003-11-23 devnull addr2 = dol;
674 bc7cb1a1 2003-11-23 devnull io = create("ed.hup", OWRITE, 0666);
675 bc7cb1a1 2003-11-23 devnull if(io > 0){
676 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OWRITE);
677 bc7cb1a1 2003-11-23 devnull putfile();
680 bc7cb1a1 2003-11-23 devnull fchange = 0;
685 bc7cb1a1 2003-11-23 devnull notifyf(void *a, char *s)
687 bc7cb1a1 2003-11-23 devnull if(strcmp(s, "interrupt") == 0){
688 bc7cb1a1 2003-11-23 devnull if(rescuing || waiting)
689 bc7cb1a1 2003-11-23 devnull noted(NCONT);
690 bb0266fe 2005-05-07 devnull putchr('\n');
691 bc7cb1a1 2003-11-23 devnull lastc = '\n';
692 bc7cb1a1 2003-11-23 devnull error1(Q);
693 bc7cb1a1 2003-11-23 devnull notejmp(a, savej, 0);
695 90c3dab6 2006-07-23 devnull if(strcmp(s, "hangup") == 0 || strcmp(s, "kill") == 0){
696 bc7cb1a1 2003-11-23 devnull if(rescuing)
697 bc7cb1a1 2003-11-23 devnull noted(NDFLT);
698 bc7cb1a1 2003-11-23 devnull rescue();
700 a0f1e21f 2004-04-20 devnull if(strstr(s, "child"))
701 a0f1e21f 2004-04-20 devnull noted(NCONT);
702 bc7cb1a1 2003-11-23 devnull fprint(2, "ed: note: %s\n", s);
703 bc7cb1a1 2003-11-23 devnull abort();
707 bc7cb1a1 2003-11-23 devnull getchr(void)
709 bc7cb1a1 2003-11-23 devnull char s[UTFmax];
713 bc7cb1a1 2003-11-23 devnull if(lastc = peekc) {
714 bc7cb1a1 2003-11-23 devnull peekc = 0;
715 bc7cb1a1 2003-11-23 devnull return lastc;
717 bc7cb1a1 2003-11-23 devnull if(globp) {
718 bc7cb1a1 2003-11-23 devnull if((lastc=*globp++) != 0)
719 bc7cb1a1 2003-11-23 devnull return lastc;
720 bc7cb1a1 2003-11-23 devnull globp = 0;
721 bc7cb1a1 2003-11-23 devnull return EOF;
723 bc7cb1a1 2003-11-23 devnull for(i=0;;) {
724 bc7cb1a1 2003-11-23 devnull if(read(0, s+i, 1) <= 0)
725 bc7cb1a1 2003-11-23 devnull return lastc = EOF;
727 bc7cb1a1 2003-11-23 devnull if(fullrune(s, i))
731 bc7cb1a1 2003-11-23 devnull chartorune(&r, s);
732 bc7cb1a1 2003-11-23 devnull lastc = r;
733 bc7cb1a1 2003-11-23 devnull return lastc;
737 bc7cb1a1 2003-11-23 devnull gety(void)
740 bc7cb1a1 2003-11-23 devnull Rune *gf, *p;
742 bc7cb1a1 2003-11-23 devnull p = linebuf;
743 bc7cb1a1 2003-11-23 devnull gf = globp;
744 bc7cb1a1 2003-11-23 devnull for(;;) {
745 bc7cb1a1 2003-11-23 devnull c = getchr();
746 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
748 bc7cb1a1 2003-11-23 devnull return 0;
750 bc7cb1a1 2003-11-23 devnull if(c == EOF) {
752 bc7cb1a1 2003-11-23 devnull peekc = c;
753 bc7cb1a1 2003-11-23 devnull return c;
755 bc7cb1a1 2003-11-23 devnull if(c == 0)
756 bc7cb1a1 2003-11-23 devnull continue;
757 bc7cb1a1 2003-11-23 devnull *p++ = c;
758 bc7cb1a1 2003-11-23 devnull if(p >= &linebuf[LBSIZE-2])
759 bc7cb1a1 2003-11-23 devnull error(Q);
764 bc7cb1a1 2003-11-23 devnull gettty(void)
768 bc7cb1a1 2003-11-23 devnull rc = gety();
770 bc7cb1a1 2003-11-23 devnull return rc;
771 bc7cb1a1 2003-11-23 devnull if(linebuf[0] == '.' && linebuf[1] == 0)
772 bc7cb1a1 2003-11-23 devnull return EOF;
773 bc7cb1a1 2003-11-23 devnull return 0;
777 bc7cb1a1 2003-11-23 devnull getfile(void)
780 bc7cb1a1 2003-11-23 devnull Rune *lp;
782 bc7cb1a1 2003-11-23 devnull lp = linebuf;
784 bc7cb1a1 2003-11-23 devnull c = Bgetrune(&iobuf);
785 bc7cb1a1 2003-11-23 devnull if(c < 0) {
786 bc7cb1a1 2003-11-23 devnull if(lp > linebuf) {
787 bc7cb1a1 2003-11-23 devnull putst("'\\n' appended");
788 bc7cb1a1 2003-11-23 devnull c = '\n';
790 bc7cb1a1 2003-11-23 devnull return EOF;
792 bc7cb1a1 2003-11-23 devnull if(lp >= &linebuf[LBSIZE]) {
793 bc7cb1a1 2003-11-23 devnull lastc = '\n';
794 bc7cb1a1 2003-11-23 devnull error(Q);
796 bc7cb1a1 2003-11-23 devnull *lp++ = c;
797 bc7cb1a1 2003-11-23 devnull count++;
798 bc7cb1a1 2003-11-23 devnull } while(c != '\n');
799 bc7cb1a1 2003-11-23 devnull lp[-1] = 0;
800 bc7cb1a1 2003-11-23 devnull return 0;
804 bc7cb1a1 2003-11-23 devnull putfile(void)
806 bc7cb1a1 2003-11-23 devnull int *a1;
807 bc7cb1a1 2003-11-23 devnull Rune *lp;
810 bc7cb1a1 2003-11-23 devnull a1 = addr1;
812 bc7cb1a1 2003-11-23 devnull lp = getline(*a1++);
813 bc7cb1a1 2003-11-23 devnull for(;;) {
814 bc7cb1a1 2003-11-23 devnull count++;
815 bc7cb1a1 2003-11-23 devnull c = *lp++;
816 bc7cb1a1 2003-11-23 devnull if(c == 0) {
817 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, '\n') < 0)
818 bc7cb1a1 2003-11-23 devnull error(Q);
821 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, c) < 0)
822 bc7cb1a1 2003-11-23 devnull error(Q);
824 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
825 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
826 bc7cb1a1 2003-11-23 devnull error(Q);
830 bc7cb1a1 2003-11-23 devnull append(int (*f)(void), int *a)
832 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *rdot, nline, tl;
834 bc7cb1a1 2003-11-23 devnull nline = 0;
835 bc7cb1a1 2003-11-23 devnull dot = a;
836 bc7cb1a1 2003-11-23 devnull while((*f)() == 0) {
837 bc7cb1a1 2003-11-23 devnull if((dol-zero) >= nlall) {
838 bc7cb1a1 2003-11-23 devnull nlall += 512;
839 bc7cb1a1 2003-11-23 devnull a1 = realloc(zero, (nlall+5)*sizeof(int*));
840 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
841 bc7cb1a1 2003-11-23 devnull error("MEM?");
842 bc7cb1a1 2003-11-23 devnull rescue();
844 bc7cb1a1 2003-11-23 devnull tl = a1 - zero; /* relocate pointers */
845 bc7cb1a1 2003-11-23 devnull zero += tl;
846 bc7cb1a1 2003-11-23 devnull addr1 += tl;
847 bc7cb1a1 2003-11-23 devnull addr2 += tl;
848 bc7cb1a1 2003-11-23 devnull dol += tl;
849 bc7cb1a1 2003-11-23 devnull dot += tl;
851 bc7cb1a1 2003-11-23 devnull tl = putline();
852 bc7cb1a1 2003-11-23 devnull nline++;
853 bc7cb1a1 2003-11-23 devnull a1 = ++dol;
854 bc7cb1a1 2003-11-23 devnull a2 = a1+1;
855 bc7cb1a1 2003-11-23 devnull rdot = ++dot;
856 bc7cb1a1 2003-11-23 devnull while(a1 > rdot)
857 bc7cb1a1 2003-11-23 devnull *--a2 = *--a1;
858 bc7cb1a1 2003-11-23 devnull *rdot = tl;
860 bc7cb1a1 2003-11-23 devnull return nline;
864 bc7cb1a1 2003-11-23 devnull add(int i)
866 bc7cb1a1 2003-11-23 devnull if(i && (given || dol > zero)) {
867 bc7cb1a1 2003-11-23 devnull addr1--;
868 bc7cb1a1 2003-11-23 devnull addr2--;
870 bc7cb1a1 2003-11-23 devnull squeeze(0);
871 bc7cb1a1 2003-11-23 devnull newline();
872 bc7cb1a1 2003-11-23 devnull append(gettty, addr2);
876 bc7cb1a1 2003-11-23 devnull browse(void)
878 bc7cb1a1 2003-11-23 devnull int forward, n;
879 bc7cb1a1 2003-11-23 devnull static int bformat, bnum; /* 0 */
881 bc7cb1a1 2003-11-23 devnull forward = 1;
882 bc7cb1a1 2003-11-23 devnull peekc = getchr();
883 bc7cb1a1 2003-11-23 devnull if(peekc != '\n'){
884 bc7cb1a1 2003-11-23 devnull if(peekc == '-' || peekc == '+') {
885 bc7cb1a1 2003-11-23 devnull if(peekc == '-')
886 bc7cb1a1 2003-11-23 devnull forward = 0;
887 bc7cb1a1 2003-11-23 devnull getchr();
889 bc7cb1a1 2003-11-23 devnull n = getnum();
890 bc7cb1a1 2003-11-23 devnull if(n > 0)
891 bc7cb1a1 2003-11-23 devnull bpagesize = n;
893 bc7cb1a1 2003-11-23 devnull newline();
894 bc7cb1a1 2003-11-23 devnull if(pflag) {
895 bc7cb1a1 2003-11-23 devnull bformat = listf;
896 bc7cb1a1 2003-11-23 devnull bnum = listn;
897 bc7cb1a1 2003-11-23 devnull } else {
898 bc7cb1a1 2003-11-23 devnull listf = bformat;
899 bc7cb1a1 2003-11-23 devnull listn = bnum;
901 bc7cb1a1 2003-11-23 devnull if(forward) {
902 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
903 bc7cb1a1 2003-11-23 devnull addr2 += bpagesize;
904 bc7cb1a1 2003-11-23 devnull if(addr2 > dol)
905 bc7cb1a1 2003-11-23 devnull addr2 = dol;
906 bc7cb1a1 2003-11-23 devnull } else {
907 bc7cb1a1 2003-11-23 devnull addr1 = addr2-bpagesize;
908 bc7cb1a1 2003-11-23 devnull if(addr1 <= zero)
909 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
911 bc7cb1a1 2003-11-23 devnull printcom();
915 bc7cb1a1 2003-11-23 devnull callunix(void)
917 bc7cb1a1 2003-11-23 devnull int c, pid;
918 bc7cb1a1 2003-11-23 devnull Rune rune;
919 bc7cb1a1 2003-11-23 devnull char buf[512];
920 bc7cb1a1 2003-11-23 devnull char *p;
922 bc7cb1a1 2003-11-23 devnull setnoaddr();
923 bc7cb1a1 2003-11-23 devnull p = buf;
924 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != EOF && c != '\n')
925 bc7cb1a1 2003-11-23 devnull if(p < &buf[sizeof(buf) - 6]) {
926 bc7cb1a1 2003-11-23 devnull rune = c;
927 bc7cb1a1 2003-11-23 devnull p += runetochar(p, &rune);
930 bc7cb1a1 2003-11-23 devnull pid = fork();
931 bc7cb1a1 2003-11-23 devnull if(pid == 0) {
932 a8ec4910 2005-07-13 devnull execlp("rc", "rc", "-c", buf, (char*)0);
933 a0f1e21f 2004-04-20 devnull sysfatal("exec failed: %r");
934 bc7cb1a1 2003-11-23 devnull exits("execl failed");
936 bc7cb1a1 2003-11-23 devnull waiting = 1;
937 bc7cb1a1 2003-11-23 devnull while(waitpid() != pid)
939 bc7cb1a1 2003-11-23 devnull waiting = 0;
940 bc7cb1a1 2003-11-23 devnull if(vflag)
941 bc7cb1a1 2003-11-23 devnull putst("!");
945 bc7cb1a1 2003-11-23 devnull quit(void)
947 bc7cb1a1 2003-11-23 devnull if(vflag && fchange && dol!=zero) {
948 bc7cb1a1 2003-11-23 devnull fchange = 0;
949 bc7cb1a1 2003-11-23 devnull error(Q);
951 bc7cb1a1 2003-11-23 devnull remove(tfname);
952 bc7cb1a1 2003-11-23 devnull exits(0);
956 bc7cb1a1 2003-11-23 devnull onquit(int sig)
958 bc7cb1a1 2003-11-23 devnull USED(sig);
963 bc7cb1a1 2003-11-23 devnull rdelete(int *ad1, int *ad2)
965 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
967 bc7cb1a1 2003-11-23 devnull a1 = ad1;
968 bc7cb1a1 2003-11-23 devnull a2 = ad2+1;
969 bc7cb1a1 2003-11-23 devnull a3 = dol;
970 bc7cb1a1 2003-11-23 devnull dol -= a2 - a1;
972 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
973 bc7cb1a1 2003-11-23 devnull } while(a2 <= a3);
974 bc7cb1a1 2003-11-23 devnull a1 = ad1;
975 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
976 bc7cb1a1 2003-11-23 devnull a1 = dol;
977 bc7cb1a1 2003-11-23 devnull dot = a1;
978 bc7cb1a1 2003-11-23 devnull fchange = 1;
982 bc7cb1a1 2003-11-23 devnull gdelete(void)
984 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
986 bc7cb1a1 2003-11-23 devnull a3 = dol;
987 bc7cb1a1 2003-11-23 devnull for(a1=zero; (*a1&01)==0; a1++)
988 bc7cb1a1 2003-11-23 devnull if(a1>=a3)
990 bc7cb1a1 2003-11-23 devnull for(a2=a1+1; a2<=a3;) {
991 bc7cb1a1 2003-11-23 devnull if(*a2 & 01) {
993 bc7cb1a1 2003-11-23 devnull dot = a1;
995 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
997 bc7cb1a1 2003-11-23 devnull dol = a1-1;
998 bc7cb1a1 2003-11-23 devnull if(dot > dol)
999 bc7cb1a1 2003-11-23 devnull dot = dol;
1000 bc7cb1a1 2003-11-23 devnull fchange = 1;
1004 bc7cb1a1 2003-11-23 devnull getline(int tl)
1006 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1007 bc7cb1a1 2003-11-23 devnull int nl;
1009 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1010 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OREAD);
1011 bc7cb1a1 2003-11-23 devnull nl = nleft;
1012 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2) - 1);
1013 bc7cb1a1 2003-11-23 devnull while(*lp++ = *bp++) {
1014 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1015 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1016 bc7cb1a1 2003-11-23 devnull bp = getblock(tl += BLKSIZE/2, OREAD);
1017 bc7cb1a1 2003-11-23 devnull nl = nleft;
1020 bc7cb1a1 2003-11-23 devnull return linebuf;
1024 bc7cb1a1 2003-11-23 devnull putline(void)
1026 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1027 bc7cb1a1 2003-11-23 devnull int nl, tl;
1029 bc7cb1a1 2003-11-23 devnull fchange = 1;
1030 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1031 bc7cb1a1 2003-11-23 devnull tl = tline;
1032 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1033 bc7cb1a1 2003-11-23 devnull nl = nleft;
1034 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2)-1);
1035 bc7cb1a1 2003-11-23 devnull while(*bp = *lp++) {
1036 bc7cb1a1 2003-11-23 devnull if(*bp++ == '\n') {
1037 bc7cb1a1 2003-11-23 devnull bp[-1] = 0;
1038 bc7cb1a1 2003-11-23 devnull linebp = lp;
1041 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1042 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1043 bc7cb1a1 2003-11-23 devnull tl += BLKSIZE/2;
1044 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1045 bc7cb1a1 2003-11-23 devnull nl = nleft;
1048 bc7cb1a1 2003-11-23 devnull nl = tline;
1049 bc7cb1a1 2003-11-23 devnull tline += ((lp-linebuf) + 03) & 077776;
1050 bc7cb1a1 2003-11-23 devnull return nl;
1054 bc7cb1a1 2003-11-23 devnull blkio(int b, uchar *buf, int isread)
1058 bc7cb1a1 2003-11-23 devnull seek(tfile, b*BLKSIZE, 0);
1059 bc7cb1a1 2003-11-23 devnull if(isread)
1060 bc7cb1a1 2003-11-23 devnull n = read(tfile, buf, BLKSIZE);
1062 bc7cb1a1 2003-11-23 devnull n = write(tfile, buf, BLKSIZE);
1063 bc7cb1a1 2003-11-23 devnull if(n != BLKSIZE)
1064 bc7cb1a1 2003-11-23 devnull error(T);
1068 bc7cb1a1 2003-11-23 devnull getblock(int atl, int iof)
1070 bc7cb1a1 2003-11-23 devnull int bno, off;
1072 bc7cb1a1 2003-11-23 devnull static uchar ibuff[BLKSIZE];
1073 bc7cb1a1 2003-11-23 devnull static uchar obuff[BLKSIZE];
1075 bc7cb1a1 2003-11-23 devnull bno = atl / (BLKSIZE/2);
1076 bc7cb1a1 2003-11-23 devnull off = (atl<<1) & (BLKSIZE-1) & ~03;
1077 bc7cb1a1 2003-11-23 devnull if(bno >= NBLK) {
1078 bc7cb1a1 2003-11-23 devnull lastc = '\n';
1079 bc7cb1a1 2003-11-23 devnull error(T);
1081 bc7cb1a1 2003-11-23 devnull nleft = BLKSIZE - off;
1082 bc7cb1a1 2003-11-23 devnull if(bno == iblock) {
1083 bc7cb1a1 2003-11-23 devnull ichanged |= iof;
1084 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1086 bc7cb1a1 2003-11-23 devnull if(bno == oblock)
1087 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1088 bc7cb1a1 2003-11-23 devnull if(iof == OREAD) {
1089 bc7cb1a1 2003-11-23 devnull if(ichanged)
1090 bc7cb1a1 2003-11-23 devnull blkio(iblock, ibuff, 0);
1091 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1092 bc7cb1a1 2003-11-23 devnull iblock = bno;
1093 bc7cb1a1 2003-11-23 devnull blkio(bno, ibuff, 1);
1094 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1096 bc7cb1a1 2003-11-23 devnull if(oblock >= 0)
1097 bc7cb1a1 2003-11-23 devnull blkio(oblock, obuff, 0);
1098 bc7cb1a1 2003-11-23 devnull oblock = bno;
1099 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1103 bc7cb1a1 2003-11-23 devnull init(void)
1105 bc7cb1a1 2003-11-23 devnull int *markp;
1107 bc7cb1a1 2003-11-23 devnull close(tfile);
1108 bc7cb1a1 2003-11-23 devnull tline = 2;
1109 bc7cb1a1 2003-11-23 devnull for(markp = names; markp < &names[26]; )
1110 bc7cb1a1 2003-11-23 devnull *markp++ = 0;
1111 bc7cb1a1 2003-11-23 devnull subnewa = 0;
1112 bc7cb1a1 2003-11-23 devnull anymarks = 0;
1113 bc7cb1a1 2003-11-23 devnull iblock = -1;
1114 bc7cb1a1 2003-11-23 devnull oblock = -1;
1115 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1116 bc7cb1a1 2003-11-23 devnull if((tfile = create(tfname, ORDWR, 0600)) < 0){
1117 bc7cb1a1 2003-11-23 devnull error1(T);
1118 bc7cb1a1 2003-11-23 devnull exits(0);
1120 bc7cb1a1 2003-11-23 devnull dot = dol = zero;
1124 bc7cb1a1 2003-11-23 devnull global(int k)
1126 bc7cb1a1 2003-11-23 devnull Rune *gp, globuf[GBSIZE];
1127 bc7cb1a1 2003-11-23 devnull int c, *a1;
1129 bc7cb1a1 2003-11-23 devnull if(globp)
1130 bc7cb1a1 2003-11-23 devnull error(Q);
1131 bc7cb1a1 2003-11-23 devnull setwide();
1132 bc7cb1a1 2003-11-23 devnull squeeze(dol > zero);
1133 bc7cb1a1 2003-11-23 devnull c = getchr();
1134 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1135 bc7cb1a1 2003-11-23 devnull error(Q);
1136 bc7cb1a1 2003-11-23 devnull compile(c);
1137 bc7cb1a1 2003-11-23 devnull gp = globuf;
1138 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != '\n') {
1139 bc7cb1a1 2003-11-23 devnull if(c == EOF)
1140 bc7cb1a1 2003-11-23 devnull error(Q);
1141 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1142 bc7cb1a1 2003-11-23 devnull c = getchr();
1143 bc7cb1a1 2003-11-23 devnull if(c != '\n')
1144 bc7cb1a1 2003-11-23 devnull *gp++ = '\\';
1146 bc7cb1a1 2003-11-23 devnull *gp++ = c;
1147 bc7cb1a1 2003-11-23 devnull if(gp >= &globuf[GBSIZE-2])
1148 bc7cb1a1 2003-11-23 devnull error(Q);
1150 bc7cb1a1 2003-11-23 devnull if(gp == globuf)
1151 bc7cb1a1 2003-11-23 devnull *gp++ = 'p';
1152 bc7cb1a1 2003-11-23 devnull *gp++ = '\n';
1153 bc7cb1a1 2003-11-23 devnull *gp = 0;
1154 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1155 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1156 bc7cb1a1 2003-11-23 devnull if(a1 >= addr1 && a1 <= addr2 && match(a1) == k)
1157 bc7cb1a1 2003-11-23 devnull *a1 |= 01;
1161 bc7cb1a1 2003-11-23 devnull * Special case: g/.../d (avoid n^2 algorithm)
1163 bc7cb1a1 2003-11-23 devnull if(globuf[0] == 'd' && globuf[1] == '\n' && globuf[2] == 0) {
1164 bc7cb1a1 2003-11-23 devnull gdelete();
1165 bc7cb1a1 2003-11-23 devnull return;
1167 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1168 bc7cb1a1 2003-11-23 devnull if(*a1 & 01) {
1169 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1170 bc7cb1a1 2003-11-23 devnull dot = a1;
1171 bc7cb1a1 2003-11-23 devnull globp = globuf;
1172 bc7cb1a1 2003-11-23 devnull commands();
1173 bc7cb1a1 2003-11-23 devnull a1 = zero;
1179 bc7cb1a1 2003-11-23 devnull join(void)
1181 bc7cb1a1 2003-11-23 devnull Rune *gp, *lp;
1182 bc7cb1a1 2003-11-23 devnull int *a1;
1184 bc7cb1a1 2003-11-23 devnull nonzero();
1185 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1186 bc7cb1a1 2003-11-23 devnull for(a1=addr1; a1<=addr2; a1++) {
1187 bc7cb1a1 2003-11-23 devnull lp = getline(*a1);
1188 bc7cb1a1 2003-11-23 devnull while(*gp = *lp++)
1189 bc7cb1a1 2003-11-23 devnull if(gp++ >= &genbuf[LBSIZE-2])
1190 bc7cb1a1 2003-11-23 devnull error(Q);
1192 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1193 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1194 bc7cb1a1 2003-11-23 devnull while(*lp++ = *gp++)
1196 bc7cb1a1 2003-11-23 devnull *addr1 = putline();
1197 bc7cb1a1 2003-11-23 devnull if(addr1 < addr2)
1198 bc7cb1a1 2003-11-23 devnull rdelete(addr1+1, addr2);
1199 bc7cb1a1 2003-11-23 devnull dot = addr1;
1203 bc7cb1a1 2003-11-23 devnull substitute(int inglob)
1205 bc7cb1a1 2003-11-23 devnull int *mp, *a1, nl, gsubf, n;
1207 bc7cb1a1 2003-11-23 devnull n = getnum(); /* OK even if n==0 */
1208 bc7cb1a1 2003-11-23 devnull gsubf = compsub();
1209 bc7cb1a1 2003-11-23 devnull for(a1 = addr1; a1 <= addr2; a1++) {
1210 bc7cb1a1 2003-11-23 devnull if(match(a1)){
1211 bc7cb1a1 2003-11-23 devnull int *ozero;
1212 bc7cb1a1 2003-11-23 devnull int m = n;
1215 bc7cb1a1 2003-11-23 devnull int span = loc2-loc1;
1217 bc7cb1a1 2003-11-23 devnull if(--m <= 0) {
1218 bc7cb1a1 2003-11-23 devnull dosub();
1219 bc7cb1a1 2003-11-23 devnull if(!gsubf)
1221 bc7cb1a1 2003-11-23 devnull if(span == 0) { /* null RE match */
1222 bc7cb1a1 2003-11-23 devnull if(*loc2 == 0)
1224 bc7cb1a1 2003-11-23 devnull loc2++;
1227 bc7cb1a1 2003-11-23 devnull } while(match(0));
1228 bc7cb1a1 2003-11-23 devnull if(m <= 0) {
1229 bc7cb1a1 2003-11-23 devnull inglob |= 01;
1230 bc7cb1a1 2003-11-23 devnull subnewa = putline();
1231 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1232 bc7cb1a1 2003-11-23 devnull if(anymarks) {
1233 bc7cb1a1 2003-11-23 devnull for(mp=names; mp<&names[26]; mp++)
1234 bc7cb1a1 2003-11-23 devnull if(*mp == *a1)
1235 bc7cb1a1 2003-11-23 devnull *mp = subnewa;
1237 bc7cb1a1 2003-11-23 devnull subolda = *a1;
1238 bc7cb1a1 2003-11-23 devnull *a1 = subnewa;
1239 bc7cb1a1 2003-11-23 devnull ozero = zero;
1240 bc7cb1a1 2003-11-23 devnull nl = append(getsub, a1);
1241 bc7cb1a1 2003-11-23 devnull addr2 += nl;
1242 bc7cb1a1 2003-11-23 devnull nl += zero-ozero;
1243 bc7cb1a1 2003-11-23 devnull a1 += nl;
1247 bc7cb1a1 2003-11-23 devnull if(inglob == 0)
1248 bc7cb1a1 2003-11-23 devnull error(Q);
1252 bc7cb1a1 2003-11-23 devnull compsub(void)
1254 bc7cb1a1 2003-11-23 devnull int seof, c;
1255 bc7cb1a1 2003-11-23 devnull Rune *p;
1257 bc7cb1a1 2003-11-23 devnull seof = getchr();
1258 bc7cb1a1 2003-11-23 devnull if(seof == '\n' || seof == ' ')
1259 bc7cb1a1 2003-11-23 devnull error(Q);
1260 bc7cb1a1 2003-11-23 devnull compile(seof);
1261 bc7cb1a1 2003-11-23 devnull p = rhsbuf;
1262 bc7cb1a1 2003-11-23 devnull for(;;) {
1263 bc7cb1a1 2003-11-23 devnull c = getchr();
1264 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1265 bc7cb1a1 2003-11-23 devnull c = getchr();
1266 bc7cb1a1 2003-11-23 devnull *p++ = ESCFLG;
1267 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1268 bc7cb1a1 2003-11-23 devnull error(Q);
1270 bc7cb1a1 2003-11-23 devnull if(c == '\n' && (!globp || !globp[0])) {
1271 bc7cb1a1 2003-11-23 devnull peekc = c;
1272 bc7cb1a1 2003-11-23 devnull pflag++;
1275 bc7cb1a1 2003-11-23 devnull if(c == seof)
1277 bc7cb1a1 2003-11-23 devnull *p++ = c;
1278 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1279 bc7cb1a1 2003-11-23 devnull error(Q);
1281 bc7cb1a1 2003-11-23 devnull *p = 0;
1282 bc7cb1a1 2003-11-23 devnull peekc = getchr();
1283 bc7cb1a1 2003-11-23 devnull if(peekc == 'g') {
1284 bc7cb1a1 2003-11-23 devnull peekc = 0;
1285 bc7cb1a1 2003-11-23 devnull newline();
1286 bc7cb1a1 2003-11-23 devnull return 1;
1288 bc7cb1a1 2003-11-23 devnull newline();
1289 bc7cb1a1 2003-11-23 devnull return 0;
1293 bc7cb1a1 2003-11-23 devnull getsub(void)
1295 bc7cb1a1 2003-11-23 devnull Rune *p1, *p2;
1297 bc7cb1a1 2003-11-23 devnull p1 = linebuf;
1298 bc7cb1a1 2003-11-23 devnull if((p2 = linebp) == 0)
1299 bc7cb1a1 2003-11-23 devnull return EOF;
1300 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
1302 bc7cb1a1 2003-11-23 devnull linebp = 0;
1303 bc7cb1a1 2003-11-23 devnull return 0;
1307 bc7cb1a1 2003-11-23 devnull dosub(void)
1309 bc7cb1a1 2003-11-23 devnull Rune *lp, *sp, *rp;
1310 bc7cb1a1 2003-11-23 devnull int c, n;
1312 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1313 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1314 bc7cb1a1 2003-11-23 devnull rp = rhsbuf;
1315 bc7cb1a1 2003-11-23 devnull while(lp < loc1)
1316 bc7cb1a1 2003-11-23 devnull *sp++ = *lp++;
1317 bc7cb1a1 2003-11-23 devnull while(c = *rp++) {
1318 bc7cb1a1 2003-11-23 devnull if(c == '&'){
1319 bc7cb1a1 2003-11-23 devnull sp = place(sp, loc1, loc2);
1320 bc7cb1a1 2003-11-23 devnull continue;
1322 bc7cb1a1 2003-11-23 devnull if(c == ESCFLG && (c = *rp++) >= '1' && c < MAXSUB+'0') {
1323 bc7cb1a1 2003-11-23 devnull n = c-'0';
1324 bc7cb1a1 2003-11-23 devnull if(subexp[n].s.rsp && subexp[n].e.rep) {
1325 bc7cb1a1 2003-11-23 devnull sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep);
1326 bc7cb1a1 2003-11-23 devnull continue;
1328 bc7cb1a1 2003-11-23 devnull error(Q);
1330 bc7cb1a1 2003-11-23 devnull *sp++ = c;
1331 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1332 bc7cb1a1 2003-11-23 devnull error(Q);
1334 bc7cb1a1 2003-11-23 devnull lp = loc2;
1335 bc7cb1a1 2003-11-23 devnull loc2 = sp - genbuf + linebuf;
1336 bc7cb1a1 2003-11-23 devnull while(*sp++ = *lp++)
1337 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1338 bc7cb1a1 2003-11-23 devnull error(Q);
1339 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1340 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1341 bc7cb1a1 2003-11-23 devnull while(*lp++ = *sp++)
1346 bc7cb1a1 2003-11-23 devnull place(Rune *sp, Rune *l1, Rune *l2)
1349 bc7cb1a1 2003-11-23 devnull while(l1 < l2) {
1350 bc7cb1a1 2003-11-23 devnull *sp++ = *l1++;
1351 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1352 bc7cb1a1 2003-11-23 devnull error(Q);
1354 bc7cb1a1 2003-11-23 devnull return sp;
1358 bc7cb1a1 2003-11-23 devnull move(int cflag)
1360 bc7cb1a1 2003-11-23 devnull int *adt, *ad1, *ad2;
1362 bc7cb1a1 2003-11-23 devnull nonzero();
1363 bc7cb1a1 2003-11-23 devnull if((adt = address())==0) /* address() guarantees addr is in range */
1364 bc7cb1a1 2003-11-23 devnull error(Q);
1365 bc7cb1a1 2003-11-23 devnull newline();
1366 bc7cb1a1 2003-11-23 devnull if(cflag) {
1367 bc7cb1a1 2003-11-23 devnull int *ozero, delta;
1368 bc7cb1a1 2003-11-23 devnull ad1 = dol;
1369 bc7cb1a1 2003-11-23 devnull ozero = zero;
1370 bc7cb1a1 2003-11-23 devnull append(getcopy, ad1++);
1371 bc7cb1a1 2003-11-23 devnull ad2 = dol;
1372 bc7cb1a1 2003-11-23 devnull delta = zero - ozero;
1373 bc7cb1a1 2003-11-23 devnull ad1 += delta;
1374 bc7cb1a1 2003-11-23 devnull adt += delta;
1375 bc7cb1a1 2003-11-23 devnull } else {
1376 bc7cb1a1 2003-11-23 devnull ad2 = addr2;
1377 bc7cb1a1 2003-11-23 devnull for(ad1 = addr1; ad1 <= ad2;)
1378 bc7cb1a1 2003-11-23 devnull *ad1++ &= ~01;
1379 bc7cb1a1 2003-11-23 devnull ad1 = addr1;
1382 bc7cb1a1 2003-11-23 devnull if(adt<ad1) {
1383 bc7cb1a1 2003-11-23 devnull dot = adt + (ad2-ad1);
1384 bc7cb1a1 2003-11-23 devnull if((++adt)==ad1)
1385 bc7cb1a1 2003-11-23 devnull return;
1386 bc7cb1a1 2003-11-23 devnull reverse(adt, ad1);
1387 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1388 bc7cb1a1 2003-11-23 devnull reverse(adt, ad2);
1390 bc7cb1a1 2003-11-23 devnull if(adt >= ad2) {
1391 bc7cb1a1 2003-11-23 devnull dot = adt++;
1392 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1393 bc7cb1a1 2003-11-23 devnull reverse(ad2, adt);
1394 bc7cb1a1 2003-11-23 devnull reverse(ad1, adt);
1396 bc7cb1a1 2003-11-23 devnull error(Q);
1397 bc7cb1a1 2003-11-23 devnull fchange = 1;
1401 bc7cb1a1 2003-11-23 devnull reverse(int *a1, int *a2)
1405 bc7cb1a1 2003-11-23 devnull for(;;) {
1406 bc7cb1a1 2003-11-23 devnull t = *--a2;
1407 bc7cb1a1 2003-11-23 devnull if(a2 <= a1)
1408 bc7cb1a1 2003-11-23 devnull return;
1409 bc7cb1a1 2003-11-23 devnull *a2 = *a1;
1410 bc7cb1a1 2003-11-23 devnull *a1++ = t;
1415 bc7cb1a1 2003-11-23 devnull getcopy(void)
1417 bc7cb1a1 2003-11-23 devnull if(addr1 > addr2)
1418 bc7cb1a1 2003-11-23 devnull return EOF;
1419 bc7cb1a1 2003-11-23 devnull getline(*addr1++);
1420 bc7cb1a1 2003-11-23 devnull return 0;
1424 bc7cb1a1 2003-11-23 devnull compile(int eof)
1426 bc7cb1a1 2003-11-23 devnull Rune c;
1427 bc7cb1a1 2003-11-23 devnull char *ep;
1428 bc7cb1a1 2003-11-23 devnull char expbuf[ESIZE];
1430 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1431 bc7cb1a1 2003-11-23 devnull peekc = c;
1432 bc7cb1a1 2003-11-23 devnull c = eof;
1434 bc7cb1a1 2003-11-23 devnull if(c == eof) {
1435 bc7cb1a1 2003-11-23 devnull if(!pattern)
1436 bc7cb1a1 2003-11-23 devnull error(Q);
1437 bc7cb1a1 2003-11-23 devnull return;
1439 bc7cb1a1 2003-11-23 devnull if(pattern) {
1440 bc7cb1a1 2003-11-23 devnull free(pattern);
1441 bc7cb1a1 2003-11-23 devnull pattern = 0;
1443 bc7cb1a1 2003-11-23 devnull ep = expbuf;
1445 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1446 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1447 bc7cb1a1 2003-11-23 devnull error(Q);
1448 bc7cb1a1 2003-11-23 devnull return;
1450 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1451 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1452 bc7cb1a1 2003-11-23 devnull error(Q);
1453 bc7cb1a1 2003-11-23 devnull return;
1456 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1457 bc7cb1a1 2003-11-23 devnull error(Q);
1458 bc7cb1a1 2003-11-23 devnull return;
1460 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1461 bc7cb1a1 2003-11-23 devnull } while((c = getchr()) != eof && c != '\n');
1462 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1463 bc7cb1a1 2003-11-23 devnull peekc = c;
1464 bc7cb1a1 2003-11-23 devnull *ep = 0;
1465 bc7cb1a1 2003-11-23 devnull pattern = regcomp(expbuf);
1469 bc7cb1a1 2003-11-23 devnull match(int *addr)
1471 bc7cb1a1 2003-11-23 devnull if(!pattern)
1472 bc7cb1a1 2003-11-23 devnull return 0;
1473 bc7cb1a1 2003-11-23 devnull if(addr){
1474 bc7cb1a1 2003-11-23 devnull if(addr == zero)
1475 bc7cb1a1 2003-11-23 devnull return 0;
1476 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = getline(*addr);
1478 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = loc2;
1479 bc7cb1a1 2003-11-23 devnull subexp[0].e.rep = 0;
1480 bc7cb1a1 2003-11-23 devnull if(rregexec(pattern, linebuf, subexp, MAXSUB)) {
1481 bc7cb1a1 2003-11-23 devnull loc1 = subexp[0].s.rsp;
1482 bc7cb1a1 2003-11-23 devnull loc2 = subexp[0].e.rep;
1483 bc7cb1a1 2003-11-23 devnull return 1;
1485 bc7cb1a1 2003-11-23 devnull loc1 = loc2 = 0;
1486 bc7cb1a1 2003-11-23 devnull return 0;
1491 bc7cb1a1 2003-11-23 devnull putd(void)
1495 bc7cb1a1 2003-11-23 devnull r = count%10;
1496 bc7cb1a1 2003-11-23 devnull count /= 10;
1497 bc7cb1a1 2003-11-23 devnull if(count)
1498 bc7cb1a1 2003-11-23 devnull putd();
1499 bb0266fe 2005-05-07 devnull putchr(r + '0');
1503 bc7cb1a1 2003-11-23 devnull putst(char *sp)
1505 bc7cb1a1 2003-11-23 devnull Rune r;
1507 bc7cb1a1 2003-11-23 devnull col = 0;
1508 bc7cb1a1 2003-11-23 devnull for(;;) {
1509 bc7cb1a1 2003-11-23 devnull sp += chartorune(&r, sp);
1510 bc7cb1a1 2003-11-23 devnull if(r == 0)
1512 bc7cb1a1 2003-11-23 devnull putchr(r);
1514 bb0266fe 2005-05-07 devnull putchr('\n');
1518 bc7cb1a1 2003-11-23 devnull putshst(Rune *sp)
1520 bc7cb1a1 2003-11-23 devnull col = 0;
1521 bc7cb1a1 2003-11-23 devnull while(*sp)
1522 bc7cb1a1 2003-11-23 devnull putchr(*sp++);
1523 bb0266fe 2005-05-07 devnull putchr('\n');
1527 bc7cb1a1 2003-11-23 devnull putchr(int ac)
1529 bc7cb1a1 2003-11-23 devnull char *lp;
1531 bc7cb1a1 2003-11-23 devnull Rune rune;
1533 bc7cb1a1 2003-11-23 devnull lp = linp;
1534 bc7cb1a1 2003-11-23 devnull c = ac;
1535 bc7cb1a1 2003-11-23 devnull if(listf) {
1536 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
1537 bc7cb1a1 2003-11-23 devnull if(linp != line && linp[-1] == ' ') {
1538 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1539 bc7cb1a1 2003-11-23 devnull *lp++ = 'n';
1541 bc7cb1a1 2003-11-23 devnull } else {
1542 bc7cb1a1 2003-11-23 devnull if(col > (72-6-2)) {
1543 bc7cb1a1 2003-11-23 devnull col = 8;
1544 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1545 bc7cb1a1 2003-11-23 devnull *lp++ = '\n';
1546 bc7cb1a1 2003-11-23 devnull *lp++ = '\t';
1549 bc7cb1a1 2003-11-23 devnull if(c=='\b' || c=='\t' || c=='\\') {
1550 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1551 bc7cb1a1 2003-11-23 devnull if(c == '\b')
1552 bc7cb1a1 2003-11-23 devnull c = 'b';
1554 bc7cb1a1 2003-11-23 devnull if(c == '\t')
1555 bc7cb1a1 2003-11-23 devnull c = 't';
1558 bc7cb1a1 2003-11-23 devnull if(c<' ' || c>='\177') {
1559 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1560 bc7cb1a1 2003-11-23 devnull *lp++ = 'x';
1561 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>12];
1562 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>8&0xF];
1563 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>4&0xF];
1564 bc7cb1a1 2003-11-23 devnull c = hex[c&0xF];
1565 bc7cb1a1 2003-11-23 devnull col += 5;
1570 bc7cb1a1 2003-11-23 devnull rune = c;
1571 bc7cb1a1 2003-11-23 devnull lp += runetochar(lp, &rune);
1573 bc7cb1a1 2003-11-23 devnull if(c == '\n' || lp >= &line[sizeof(line)-5]) {
1574 bc7cb1a1 2003-11-23 devnull linp = line;
1575 bc7cb1a1 2003-11-23 devnull write(oflag? 2: 1, line, lp-line);
1576 bc7cb1a1 2003-11-23 devnull return;
1578 bc7cb1a1 2003-11-23 devnull linp = lp;
1582 bc7cb1a1 2003-11-23 devnull mktemp(char *as)
1584 bc7cb1a1 2003-11-23 devnull char *s;
1585 bc7cb1a1 2003-11-23 devnull unsigned pid;
1588 bc7cb1a1 2003-11-23 devnull pid = getpid();
1589 bc7cb1a1 2003-11-23 devnull s = as;
1590 bc7cb1a1 2003-11-23 devnull while(*s++)
1593 bc7cb1a1 2003-11-23 devnull while(*--s == 'X') {
1594 bc7cb1a1 2003-11-23 devnull *s = pid % 10 + '0';
1595 bc7cb1a1 2003-11-23 devnull pid /= 10;
1598 bc7cb1a1 2003-11-23 devnull i = 'a';
1599 bc7cb1a1 2003-11-23 devnull while(access(as, 0) != -1) {
1600 bc7cb1a1 2003-11-23 devnull if(i == 'z')
1601 bc7cb1a1 2003-11-23 devnull return "/";
1602 bc7cb1a1 2003-11-23 devnull *s = i++;
1604 bc7cb1a1 2003-11-23 devnull return as;
1608 bc7cb1a1 2003-11-23 devnull regerror(char *s)
1610 bc7cb1a1 2003-11-23 devnull USED(s);
1611 bc7cb1a1 2003-11-23 devnull error(Q);