Blame


1 bc7cb1a1 2003-11-23 devnull /*
2 bc7cb1a1 2003-11-23 devnull * Editor
3 bc7cb1a1 2003-11-23 devnull */
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>
8 6b2d0fd9 2004-03-26 devnull
9 6b2d0fd9 2004-03-26 devnull #undef EOF /* stdio? */
10 bc7cb1a1 2003-11-23 devnull
11 bc7cb1a1 2003-11-23 devnull enum
12 bc7cb1a1 2003-11-23 devnull {
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 */
21 bc7cb1a1 2003-11-23 devnull EOF = -1,
22 bc7cb1a1 2003-11-23 devnull };
23 bc7cb1a1 2003-11-23 devnull
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;
29 bc7cb1a1 2003-11-23 devnull int col;
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;
40 bc7cb1a1 2003-11-23 devnull int io;
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;
69 bc7cb1a1 2003-11-23 devnull
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;
79 bc7cb1a1 2003-11-23 devnull
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);
124 bc7cb1a1 2003-11-23 devnull
125 bc7cb1a1 2003-11-23 devnull Rune La[] = { 'a', 0 };
126 bc7cb1a1 2003-11-23 devnull Rune Lr[] = { 'r', 0 };
127 bc7cb1a1 2003-11-23 devnull
128 bc7cb1a1 2003-11-23 devnull char tmp[] = "/tmp/eXXXXX";
129 bc7cb1a1 2003-11-23 devnull
130 bc7cb1a1 2003-11-23 devnull void
131 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
132 bc7cb1a1 2003-11-23 devnull {
133 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
134 bc7cb1a1 2003-11-23 devnull
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;
140 bc7cb1a1 2003-11-23 devnull break;
141 bc7cb1a1 2003-11-23 devnull } ARGEND
142 bc7cb1a1 2003-11-23 devnull
143 bc7cb1a1 2003-11-23 devnull USED(argc);
144 bc7cb1a1 2003-11-23 devnull if(*argv && (strcmp(*argv, "-") == 0)) {
145 bc7cb1a1 2003-11-23 devnull argv++;
146 bc7cb1a1 2003-11-23 devnull vflag = 0;
147 bc7cb1a1 2003-11-23 devnull }
148 bc7cb1a1 2003-11-23 devnull if(oflag) {
149 bc7cb1a1 2003-11-23 devnull p1 = "/fd/1";
150 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
151 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
152 bc7cb1a1 2003-11-23 devnull ;
153 bc7cb1a1 2003-11-23 devnull globp = La;
154 bc7cb1a1 2003-11-23 devnull } else
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)])
160 bc7cb1a1 2003-11-23 devnull p2--;
161 bc7cb1a1 2003-11-23 devnull globp = Lr;
162 bc7cb1a1 2003-11-23 devnull }
163 bc7cb1a1 2003-11-23 devnull zero = malloc((nlall+5)*sizeof(int*));
164 bc7cb1a1 2003-11-23 devnull tfname = mktemp(tmp);
165 bc7cb1a1 2003-11-23 devnull init();
166 bc7cb1a1 2003-11-23 devnull setjmp(savej);
167 bc7cb1a1 2003-11-23 devnull commands();
168 bc7cb1a1 2003-11-23 devnull quit();
169 bc7cb1a1 2003-11-23 devnull }
170 bc7cb1a1 2003-11-23 devnull
171 bc7cb1a1 2003-11-23 devnull void
172 bc7cb1a1 2003-11-23 devnull commands(void)
173 bc7cb1a1 2003-11-23 devnull {
174 bc7cb1a1 2003-11-23 devnull int *a1, c, temp;
175 bc7cb1a1 2003-11-23 devnull char lastsep;
176 bc7cb1a1 2003-11-23 devnull Dir *d;
177 bc7cb1a1 2003-11-23 devnull
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();
183 bc7cb1a1 2003-11-23 devnull }
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 != ';')
190 bc7cb1a1 2003-11-23 devnull break;
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)
196 bc7cb1a1 2003-11-23 devnull a1--;
197 bc7cb1a1 2003-11-23 devnull }
198 bc7cb1a1 2003-11-23 devnull addr1 = a1;
199 bc7cb1a1 2003-11-23 devnull if(c == ';')
200 bc7cb1a1 2003-11-23 devnull dot = a1;
201 bc7cb1a1 2003-11-23 devnull }
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;
207 bc7cb1a1 2003-11-23 devnull } else
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) {
212 bc7cb1a1 2003-11-23 devnull
213 bc7cb1a1 2003-11-23 devnull case 'a':
214 bc7cb1a1 2003-11-23 devnull add(0);
215 bc7cb1a1 2003-11-23 devnull continue;
216 bc7cb1a1 2003-11-23 devnull
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;
221 bc7cb1a1 2003-11-23 devnull
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;
228 bc7cb1a1 2003-11-23 devnull
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;
234 bc7cb1a1 2003-11-23 devnull
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);
243 bc7cb1a1 2003-11-23 devnull }
244 bc7cb1a1 2003-11-23 devnull filename(c);
245 bc7cb1a1 2003-11-23 devnull init();
246 bc7cb1a1 2003-11-23 devnull addr2 = zero;
247 bc7cb1a1 2003-11-23 devnull goto caseread;
248 bc7cb1a1 2003-11-23 devnull
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;
254 bc7cb1a1 2003-11-23 devnull
255 bc7cb1a1 2003-11-23 devnull case 'g':
256 bc7cb1a1 2003-11-23 devnull global(1);
257 bc7cb1a1 2003-11-23 devnull continue;
258 bc7cb1a1 2003-11-23 devnull
259 bc7cb1a1 2003-11-23 devnull case 'i':
260 bc7cb1a1 2003-11-23 devnull add(-1);
261 bc7cb1a1 2003-11-23 devnull continue;
262 bc7cb1a1 2003-11-23 devnull
263 bc7cb1a1 2003-11-23 devnull
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();
268 bc7cb1a1 2003-11-23 devnull join();
269 bc7cb1a1 2003-11-23 devnull continue;
270 bc7cb1a1 2003-11-23 devnull
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;
280 bc7cb1a1 2003-11-23 devnull
281 bc7cb1a1 2003-11-23 devnull case 'm':
282 bc7cb1a1 2003-11-23 devnull move(0);
283 bc7cb1a1 2003-11-23 devnull continue;
284 bc7cb1a1 2003-11-23 devnull
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;
290 bc7cb1a1 2003-11-23 devnull
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;
296 bc7cb1a1 2003-11-23 devnull }
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;
301 bc7cb1a1 2003-11-23 devnull
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;
309 bc7cb1a1 2003-11-23 devnull
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();
315 bc7cb1a1 2003-11-23 devnull quit();
316 bc7cb1a1 2003-11-23 devnull
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);
323 bc7cb1a1 2003-11-23 devnull }
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);
328 bc7cb1a1 2003-11-23 devnull }
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);
335 bc7cb1a1 2003-11-23 devnull
336 bc7cb1a1 2003-11-23 devnull fchange = c;
337 bc7cb1a1 2003-11-23 devnull continue;
338 bc7cb1a1 2003-11-23 devnull
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;
343 bc7cb1a1 2003-11-23 devnull
344 bc7cb1a1 2003-11-23 devnull case 't':
345 bc7cb1a1 2003-11-23 devnull move(1);
346 bc7cb1a1 2003-11-23 devnull continue;
347 bc7cb1a1 2003-11-23 devnull
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;
356 bc7cb1a1 2003-11-23 devnull
357 bc7cb1a1 2003-11-23 devnull case 'v':
358 bc7cb1a1 2003-11-23 devnull global(0);
359 bc7cb1a1 2003-11-23 devnull continue;
360 bc7cb1a1 2003-11-23 devnull
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;
370 bc7cb1a1 2003-11-23 devnull }
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)
387 bc7cb1a1 2003-11-23 devnull quit();
388 bc7cb1a1 2003-11-23 devnull continue;
389 bc7cb1a1 2003-11-23 devnull
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;
395 bc7cb1a1 2003-11-23 devnull putd();
396 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
397 bc7cb1a1 2003-11-23 devnull continue;
398 bc7cb1a1 2003-11-23 devnull
399 bc7cb1a1 2003-11-23 devnull case '!':
400 bc7cb1a1 2003-11-23 devnull callunix();
401 bc7cb1a1 2003-11-23 devnull continue;
402 bc7cb1a1 2003-11-23 devnull
403 bc7cb1a1 2003-11-23 devnull case EOF:
404 bc7cb1a1 2003-11-23 devnull return;
405 bc7cb1a1 2003-11-23 devnull
406 bc7cb1a1 2003-11-23 devnull }
407 bc7cb1a1 2003-11-23 devnull error(Q);
408 bc7cb1a1 2003-11-23 devnull }
409 bc7cb1a1 2003-11-23 devnull }
410 bc7cb1a1 2003-11-23 devnull
411 bc7cb1a1 2003-11-23 devnull void
412 bc7cb1a1 2003-11-23 devnull printcom(void)
413 bc7cb1a1 2003-11-23 devnull {
414 bc7cb1a1 2003-11-23 devnull int *a1;
415 bc7cb1a1 2003-11-23 devnull
416 bc7cb1a1 2003-11-23 devnull nonzero();
417 bc7cb1a1 2003-11-23 devnull a1 = addr1;
418 bc7cb1a1 2003-11-23 devnull do {
419 bc7cb1a1 2003-11-23 devnull if(listn) {
420 bc7cb1a1 2003-11-23 devnull count = a1-zero;
421 bc7cb1a1 2003-11-23 devnull putd();
422 bc7cb1a1 2003-11-23 devnull putchr(L'\t');
423 bc7cb1a1 2003-11-23 devnull }
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;
430 bc7cb1a1 2003-11-23 devnull }
431 bc7cb1a1 2003-11-23 devnull
432 bc7cb1a1 2003-11-23 devnull int*
433 bc7cb1a1 2003-11-23 devnull address(void)
434 bc7cb1a1 2003-11-23 devnull {
435 bc7cb1a1 2003-11-23 devnull int sign, *a, opcnt, nextopand, *b, c;
436 bc7cb1a1 2003-11-23 devnull
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;
441 bc7cb1a1 2003-11-23 devnull do {
442 bc7cb1a1 2003-11-23 devnull do {
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();
450 bc7cb1a1 2003-11-23 devnull } else
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);
457 bc7cb1a1 2003-11-23 devnull break;
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;
463 bc7cb1a1 2003-11-23 devnull do {
464 bc7cb1a1 2003-11-23 devnull a++;
465 bc7cb1a1 2003-11-23 devnull } while(a <= dol && names[c-'a'] != (*a & ~01));
466 bc7cb1a1 2003-11-23 devnull break;
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);
471 bc7cb1a1 2003-11-23 devnull b = a;
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))
479 bc7cb1a1 2003-11-23 devnull break;
480 bc7cb1a1 2003-11-23 devnull if(a == b)
481 bc7cb1a1 2003-11-23 devnull error(Q);
482 bc7cb1a1 2003-11-23 devnull }
483 bc7cb1a1 2003-11-23 devnull break;
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); */
489 bc7cb1a1 2003-11-23 devnull }
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)
493 bc7cb1a1 2003-11-23 devnull a = 0;
494 bc7cb1a1 2003-11-23 devnull return a;
495 bc7cb1a1 2003-11-23 devnull }
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;
501 bc7cb1a1 2003-11-23 devnull }
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;
507 bc7cb1a1 2003-11-23 devnull }
508 bc7cb1a1 2003-11-23 devnull
509 bc7cb1a1 2003-11-23 devnull int
510 bc7cb1a1 2003-11-23 devnull getnum(void)
511 bc7cb1a1 2003-11-23 devnull {
512 bc7cb1a1 2003-11-23 devnull int r, c;
513 bc7cb1a1 2003-11-23 devnull
514 bc7cb1a1 2003-11-23 devnull r = 0;
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')
518 bc7cb1a1 2003-11-23 devnull break;
519 bc7cb1a1 2003-11-23 devnull r = r*10 + (c-'0');
520 bc7cb1a1 2003-11-23 devnull }
521 bc7cb1a1 2003-11-23 devnull peekc = c;
522 bc7cb1a1 2003-11-23 devnull return r;
523 bc7cb1a1 2003-11-23 devnull }
524 bc7cb1a1 2003-11-23 devnull
525 bc7cb1a1 2003-11-23 devnull void
526 bc7cb1a1 2003-11-23 devnull setwide(void)
527 bc7cb1a1 2003-11-23 devnull {
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;
531 bc7cb1a1 2003-11-23 devnull }
532 bc7cb1a1 2003-11-23 devnull }
533 bc7cb1a1 2003-11-23 devnull
534 bc7cb1a1 2003-11-23 devnull void
535 bc7cb1a1 2003-11-23 devnull setnoaddr(void)
536 bc7cb1a1 2003-11-23 devnull {
537 bc7cb1a1 2003-11-23 devnull if(given)
538 bc7cb1a1 2003-11-23 devnull error(Q);
539 bc7cb1a1 2003-11-23 devnull }
540 bc7cb1a1 2003-11-23 devnull
541 bc7cb1a1 2003-11-23 devnull void
542 bc7cb1a1 2003-11-23 devnull nonzero(void)
543 bc7cb1a1 2003-11-23 devnull {
544 bc7cb1a1 2003-11-23 devnull squeeze(1);
545 bc7cb1a1 2003-11-23 devnull }
546 bc7cb1a1 2003-11-23 devnull
547 bc7cb1a1 2003-11-23 devnull void
548 bc7cb1a1 2003-11-23 devnull squeeze(int i)
549 bc7cb1a1 2003-11-23 devnull {
550 bc7cb1a1 2003-11-23 devnull if(addr1 < zero+i || addr2 > dol || addr1 > addr2)
551 bc7cb1a1 2003-11-23 devnull error(Q);
552 bc7cb1a1 2003-11-23 devnull }
553 bc7cb1a1 2003-11-23 devnull
554 bc7cb1a1 2003-11-23 devnull void
555 bc7cb1a1 2003-11-23 devnull newline(void)
556 bc7cb1a1 2003-11-23 devnull {
557 bc7cb1a1 2003-11-23 devnull int c;
558 bc7cb1a1 2003-11-23 devnull
559 bc7cb1a1 2003-11-23 devnull c = getchr();
560 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF)
561 bc7cb1a1 2003-11-23 devnull return;
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++;
566 bc7cb1a1 2003-11-23 devnull else
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')
571 bc7cb1a1 2003-11-23 devnull return;
572 bc7cb1a1 2003-11-23 devnull }
573 bc7cb1a1 2003-11-23 devnull error(Q);
574 bc7cb1a1 2003-11-23 devnull }
575 bc7cb1a1 2003-11-23 devnull
576 bc7cb1a1 2003-11-23 devnull void
577 bc7cb1a1 2003-11-23 devnull filename(int comm)
578 bc7cb1a1 2003-11-23 devnull {
579 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
580 bc7cb1a1 2003-11-23 devnull Rune rune;
581 bc7cb1a1 2003-11-23 devnull int c;
582 bc7cb1a1 2003-11-23 devnull
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++)
591 bc7cb1a1 2003-11-23 devnull ;
592 bc7cb1a1 2003-11-23 devnull return;
593 bc7cb1a1 2003-11-23 devnull }
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()) == ' ')
597 bc7cb1a1 2003-11-23 devnull ;
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;
601 bc7cb1a1 2003-11-23 devnull do {
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++)
612 bc7cb1a1 2003-11-23 devnull ;
613 bc7cb1a1 2003-11-23 devnull }
614 bc7cb1a1 2003-11-23 devnull }
615 bc7cb1a1 2003-11-23 devnull
616 bc7cb1a1 2003-11-23 devnull void
617 bc7cb1a1 2003-11-23 devnull exfile(int om)
618 bc7cb1a1 2003-11-23 devnull {
619 bc7cb1a1 2003-11-23 devnull
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) {
626 bc7cb1a1 2003-11-23 devnull putd();
627 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
628 bc7cb1a1 2003-11-23 devnull }
629 bc7cb1a1 2003-11-23 devnull }
630 bc7cb1a1 2003-11-23 devnull
631 bc7cb1a1 2003-11-23 devnull void
632 bc7cb1a1 2003-11-23 devnull error1(char *s)
633 bc7cb1a1 2003-11-23 devnull {
634 bc7cb1a1 2003-11-23 devnull int c;
635 bc7cb1a1 2003-11-23 devnull
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)
650 bc7cb1a1 2003-11-23 devnull break;
651 bc7cb1a1 2003-11-23 devnull }
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;
655 bc7cb1a1 2003-11-23 devnull }
656 bc7cb1a1 2003-11-23 devnull putchr(L'?');
657 bc7cb1a1 2003-11-23 devnull putst(s);
658 bc7cb1a1 2003-11-23 devnull }
659 bc7cb1a1 2003-11-23 devnull
660 bc7cb1a1 2003-11-23 devnull void
661 bc7cb1a1 2003-11-23 devnull error(char *s)
662 bc7cb1a1 2003-11-23 devnull {
663 bc7cb1a1 2003-11-23 devnull error1(s);
664 bc7cb1a1 2003-11-23 devnull longjmp(savej, 1);
665 bc7cb1a1 2003-11-23 devnull }
666 bc7cb1a1 2003-11-23 devnull
667 bc7cb1a1 2003-11-23 devnull void
668 bc7cb1a1 2003-11-23 devnull rescue(void)
669 bc7cb1a1 2003-11-23 devnull {
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();
678 bc7cb1a1 2003-11-23 devnull }
679 bc7cb1a1 2003-11-23 devnull }
680 bc7cb1a1 2003-11-23 devnull fchange = 0;
681 bc7cb1a1 2003-11-23 devnull quit();
682 bc7cb1a1 2003-11-23 devnull }
683 bc7cb1a1 2003-11-23 devnull
684 bc7cb1a1 2003-11-23 devnull void
685 bc7cb1a1 2003-11-23 devnull notifyf(void *a, char *s)
686 bc7cb1a1 2003-11-23 devnull {
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 bc7cb1a1 2003-11-23 devnull putchr(L'\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);
694 bc7cb1a1 2003-11-23 devnull }
695 bc7cb1a1 2003-11-23 devnull if(strcmp(s, "hangup") == 0){
696 bc7cb1a1 2003-11-23 devnull if(rescuing)
697 bc7cb1a1 2003-11-23 devnull noted(NDFLT);
698 bc7cb1a1 2003-11-23 devnull rescue();
699 bc7cb1a1 2003-11-23 devnull }
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();
704 bc7cb1a1 2003-11-23 devnull }
705 bc7cb1a1 2003-11-23 devnull
706 bc7cb1a1 2003-11-23 devnull int
707 bc7cb1a1 2003-11-23 devnull getchr(void)
708 bc7cb1a1 2003-11-23 devnull {
709 bc7cb1a1 2003-11-23 devnull char s[UTFmax];
710 bc7cb1a1 2003-11-23 devnull int i;
711 bc7cb1a1 2003-11-23 devnull Rune r;
712 bc7cb1a1 2003-11-23 devnull
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;
716 bc7cb1a1 2003-11-23 devnull }
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;
722 bc7cb1a1 2003-11-23 devnull }
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;
726 bc7cb1a1 2003-11-23 devnull i++;
727 bc7cb1a1 2003-11-23 devnull if(fullrune(s, i))
728 bc7cb1a1 2003-11-23 devnull break;
729 bc7cb1a1 2003-11-23 devnull
730 bc7cb1a1 2003-11-23 devnull }
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;
734 bc7cb1a1 2003-11-23 devnull }
735 bc7cb1a1 2003-11-23 devnull
736 bc7cb1a1 2003-11-23 devnull int
737 bc7cb1a1 2003-11-23 devnull gety(void)
738 bc7cb1a1 2003-11-23 devnull {
739 bc7cb1a1 2003-11-23 devnull int c;
740 bc7cb1a1 2003-11-23 devnull Rune *gf, *p;
741 bc7cb1a1 2003-11-23 devnull
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') {
747 bc7cb1a1 2003-11-23 devnull *p = 0;
748 bc7cb1a1 2003-11-23 devnull return 0;
749 bc7cb1a1 2003-11-23 devnull }
750 bc7cb1a1 2003-11-23 devnull if(c == EOF) {
751 bc7cb1a1 2003-11-23 devnull if(gf)
752 bc7cb1a1 2003-11-23 devnull peekc = c;
753 bc7cb1a1 2003-11-23 devnull return c;
754 bc7cb1a1 2003-11-23 devnull }
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);
760 bc7cb1a1 2003-11-23 devnull }
761 bc7cb1a1 2003-11-23 devnull return 0;
762 bc7cb1a1 2003-11-23 devnull }
763 bc7cb1a1 2003-11-23 devnull
764 bc7cb1a1 2003-11-23 devnull int
765 bc7cb1a1 2003-11-23 devnull gettty(void)
766 bc7cb1a1 2003-11-23 devnull {
767 bc7cb1a1 2003-11-23 devnull int rc;
768 bc7cb1a1 2003-11-23 devnull
769 bc7cb1a1 2003-11-23 devnull rc = gety();
770 bc7cb1a1 2003-11-23 devnull if(rc)
771 bc7cb1a1 2003-11-23 devnull return rc;
772 bc7cb1a1 2003-11-23 devnull if(linebuf[0] == '.' && linebuf[1] == 0)
773 bc7cb1a1 2003-11-23 devnull return EOF;
774 bc7cb1a1 2003-11-23 devnull return 0;
775 bc7cb1a1 2003-11-23 devnull }
776 bc7cb1a1 2003-11-23 devnull
777 bc7cb1a1 2003-11-23 devnull int
778 bc7cb1a1 2003-11-23 devnull getfile(void)
779 bc7cb1a1 2003-11-23 devnull {
780 bc7cb1a1 2003-11-23 devnull int c;
781 bc7cb1a1 2003-11-23 devnull Rune *lp;
782 bc7cb1a1 2003-11-23 devnull
783 bc7cb1a1 2003-11-23 devnull lp = linebuf;
784 bc7cb1a1 2003-11-23 devnull do {
785 bc7cb1a1 2003-11-23 devnull c = Bgetrune(&iobuf);
786 bc7cb1a1 2003-11-23 devnull if(c < 0) {
787 bc7cb1a1 2003-11-23 devnull if(lp > linebuf) {
788 bc7cb1a1 2003-11-23 devnull putst("'\\n' appended");
789 bc7cb1a1 2003-11-23 devnull c = '\n';
790 bc7cb1a1 2003-11-23 devnull } else
791 bc7cb1a1 2003-11-23 devnull return EOF;
792 bc7cb1a1 2003-11-23 devnull }
793 bc7cb1a1 2003-11-23 devnull if(lp >= &linebuf[LBSIZE]) {
794 bc7cb1a1 2003-11-23 devnull lastc = '\n';
795 bc7cb1a1 2003-11-23 devnull error(Q);
796 bc7cb1a1 2003-11-23 devnull }
797 bc7cb1a1 2003-11-23 devnull *lp++ = c;
798 bc7cb1a1 2003-11-23 devnull count++;
799 bc7cb1a1 2003-11-23 devnull } while(c != '\n');
800 bc7cb1a1 2003-11-23 devnull lp[-1] = 0;
801 bc7cb1a1 2003-11-23 devnull return 0;
802 bc7cb1a1 2003-11-23 devnull }
803 bc7cb1a1 2003-11-23 devnull
804 bc7cb1a1 2003-11-23 devnull void
805 bc7cb1a1 2003-11-23 devnull putfile(void)
806 bc7cb1a1 2003-11-23 devnull {
807 bc7cb1a1 2003-11-23 devnull int *a1;
808 bc7cb1a1 2003-11-23 devnull Rune *lp;
809 bc7cb1a1 2003-11-23 devnull long c;
810 bc7cb1a1 2003-11-23 devnull
811 bc7cb1a1 2003-11-23 devnull a1 = addr1;
812 bc7cb1a1 2003-11-23 devnull do {
813 bc7cb1a1 2003-11-23 devnull lp = getline(*a1++);
814 bc7cb1a1 2003-11-23 devnull for(;;) {
815 bc7cb1a1 2003-11-23 devnull count++;
816 bc7cb1a1 2003-11-23 devnull c = *lp++;
817 bc7cb1a1 2003-11-23 devnull if(c == 0) {
818 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, '\n') < 0)
819 bc7cb1a1 2003-11-23 devnull error(Q);
820 bc7cb1a1 2003-11-23 devnull break;
821 bc7cb1a1 2003-11-23 devnull }
822 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, c) < 0)
823 bc7cb1a1 2003-11-23 devnull error(Q);
824 bc7cb1a1 2003-11-23 devnull }
825 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
826 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
827 bc7cb1a1 2003-11-23 devnull error(Q);
828 bc7cb1a1 2003-11-23 devnull }
829 bc7cb1a1 2003-11-23 devnull
830 bc7cb1a1 2003-11-23 devnull int
831 bc7cb1a1 2003-11-23 devnull append(int (*f)(void), int *a)
832 bc7cb1a1 2003-11-23 devnull {
833 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *rdot, nline, tl;
834 bc7cb1a1 2003-11-23 devnull
835 bc7cb1a1 2003-11-23 devnull nline = 0;
836 bc7cb1a1 2003-11-23 devnull dot = a;
837 bc7cb1a1 2003-11-23 devnull while((*f)() == 0) {
838 bc7cb1a1 2003-11-23 devnull if((dol-zero) >= nlall) {
839 bc7cb1a1 2003-11-23 devnull nlall += 512;
840 bc7cb1a1 2003-11-23 devnull a1 = realloc(zero, (nlall+5)*sizeof(int*));
841 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
842 bc7cb1a1 2003-11-23 devnull error("MEM?");
843 bc7cb1a1 2003-11-23 devnull rescue();
844 bc7cb1a1 2003-11-23 devnull }
845 bc7cb1a1 2003-11-23 devnull tl = a1 - zero; /* relocate pointers */
846 bc7cb1a1 2003-11-23 devnull zero += tl;
847 bc7cb1a1 2003-11-23 devnull addr1 += tl;
848 bc7cb1a1 2003-11-23 devnull addr2 += tl;
849 bc7cb1a1 2003-11-23 devnull dol += tl;
850 bc7cb1a1 2003-11-23 devnull dot += tl;
851 bc7cb1a1 2003-11-23 devnull }
852 bc7cb1a1 2003-11-23 devnull tl = putline();
853 bc7cb1a1 2003-11-23 devnull nline++;
854 bc7cb1a1 2003-11-23 devnull a1 = ++dol;
855 bc7cb1a1 2003-11-23 devnull a2 = a1+1;
856 bc7cb1a1 2003-11-23 devnull rdot = ++dot;
857 bc7cb1a1 2003-11-23 devnull while(a1 > rdot)
858 bc7cb1a1 2003-11-23 devnull *--a2 = *--a1;
859 bc7cb1a1 2003-11-23 devnull *rdot = tl;
860 bc7cb1a1 2003-11-23 devnull }
861 bc7cb1a1 2003-11-23 devnull return nline;
862 bc7cb1a1 2003-11-23 devnull }
863 bc7cb1a1 2003-11-23 devnull
864 bc7cb1a1 2003-11-23 devnull void
865 bc7cb1a1 2003-11-23 devnull add(int i)
866 bc7cb1a1 2003-11-23 devnull {
867 bc7cb1a1 2003-11-23 devnull if(i && (given || dol > zero)) {
868 bc7cb1a1 2003-11-23 devnull addr1--;
869 bc7cb1a1 2003-11-23 devnull addr2--;
870 bc7cb1a1 2003-11-23 devnull }
871 bc7cb1a1 2003-11-23 devnull squeeze(0);
872 bc7cb1a1 2003-11-23 devnull newline();
873 bc7cb1a1 2003-11-23 devnull append(gettty, addr2);
874 bc7cb1a1 2003-11-23 devnull }
875 bc7cb1a1 2003-11-23 devnull
876 bc7cb1a1 2003-11-23 devnull void
877 bc7cb1a1 2003-11-23 devnull browse(void)
878 bc7cb1a1 2003-11-23 devnull {
879 bc7cb1a1 2003-11-23 devnull int forward, n;
880 bc7cb1a1 2003-11-23 devnull static int bformat, bnum; /* 0 */
881 bc7cb1a1 2003-11-23 devnull
882 bc7cb1a1 2003-11-23 devnull forward = 1;
883 bc7cb1a1 2003-11-23 devnull peekc = getchr();
884 bc7cb1a1 2003-11-23 devnull if(peekc != '\n'){
885 bc7cb1a1 2003-11-23 devnull if(peekc == '-' || peekc == '+') {
886 bc7cb1a1 2003-11-23 devnull if(peekc == '-')
887 bc7cb1a1 2003-11-23 devnull forward = 0;
888 bc7cb1a1 2003-11-23 devnull getchr();
889 bc7cb1a1 2003-11-23 devnull }
890 bc7cb1a1 2003-11-23 devnull n = getnum();
891 bc7cb1a1 2003-11-23 devnull if(n > 0)
892 bc7cb1a1 2003-11-23 devnull bpagesize = n;
893 bc7cb1a1 2003-11-23 devnull }
894 bc7cb1a1 2003-11-23 devnull newline();
895 bc7cb1a1 2003-11-23 devnull if(pflag) {
896 bc7cb1a1 2003-11-23 devnull bformat = listf;
897 bc7cb1a1 2003-11-23 devnull bnum = listn;
898 bc7cb1a1 2003-11-23 devnull } else {
899 bc7cb1a1 2003-11-23 devnull listf = bformat;
900 bc7cb1a1 2003-11-23 devnull listn = bnum;
901 bc7cb1a1 2003-11-23 devnull }
902 bc7cb1a1 2003-11-23 devnull if(forward) {
903 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
904 bc7cb1a1 2003-11-23 devnull addr2 += bpagesize;
905 bc7cb1a1 2003-11-23 devnull if(addr2 > dol)
906 bc7cb1a1 2003-11-23 devnull addr2 = dol;
907 bc7cb1a1 2003-11-23 devnull } else {
908 bc7cb1a1 2003-11-23 devnull addr1 = addr2-bpagesize;
909 bc7cb1a1 2003-11-23 devnull if(addr1 <= zero)
910 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
911 bc7cb1a1 2003-11-23 devnull }
912 bc7cb1a1 2003-11-23 devnull printcom();
913 bc7cb1a1 2003-11-23 devnull }
914 bc7cb1a1 2003-11-23 devnull
915 bc7cb1a1 2003-11-23 devnull void
916 bc7cb1a1 2003-11-23 devnull callunix(void)
917 bc7cb1a1 2003-11-23 devnull {
918 bc7cb1a1 2003-11-23 devnull int c, pid;
919 bc7cb1a1 2003-11-23 devnull Rune rune;
920 bc7cb1a1 2003-11-23 devnull char buf[512];
921 bc7cb1a1 2003-11-23 devnull char *p;
922 bc7cb1a1 2003-11-23 devnull
923 bc7cb1a1 2003-11-23 devnull setnoaddr();
924 bc7cb1a1 2003-11-23 devnull p = buf;
925 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != EOF && c != '\n')
926 bc7cb1a1 2003-11-23 devnull if(p < &buf[sizeof(buf) - 6]) {
927 bc7cb1a1 2003-11-23 devnull rune = c;
928 bc7cb1a1 2003-11-23 devnull p += runetochar(p, &rune);
929 bc7cb1a1 2003-11-23 devnull }
930 bc7cb1a1 2003-11-23 devnull *p = 0;
931 bc7cb1a1 2003-11-23 devnull pid = fork();
932 bc7cb1a1 2003-11-23 devnull if(pid == 0) {
933 a0f1e21f 2004-04-20 devnull execlp("rc", "rc", "-c", buf, 0);
934 a0f1e21f 2004-04-20 devnull sysfatal("exec failed: %r");
935 bc7cb1a1 2003-11-23 devnull exits("execl failed");
936 bc7cb1a1 2003-11-23 devnull }
937 bc7cb1a1 2003-11-23 devnull waiting = 1;
938 bc7cb1a1 2003-11-23 devnull while(waitpid() != pid)
939 bc7cb1a1 2003-11-23 devnull ;
940 bc7cb1a1 2003-11-23 devnull waiting = 0;
941 bc7cb1a1 2003-11-23 devnull if(vflag)
942 bc7cb1a1 2003-11-23 devnull putst("!");
943 bc7cb1a1 2003-11-23 devnull }
944 bc7cb1a1 2003-11-23 devnull
945 bc7cb1a1 2003-11-23 devnull void
946 bc7cb1a1 2003-11-23 devnull quit(void)
947 bc7cb1a1 2003-11-23 devnull {
948 bc7cb1a1 2003-11-23 devnull if(vflag && fchange && dol!=zero) {
949 bc7cb1a1 2003-11-23 devnull fchange = 0;
950 bc7cb1a1 2003-11-23 devnull error(Q);
951 bc7cb1a1 2003-11-23 devnull }
952 bc7cb1a1 2003-11-23 devnull remove(tfname);
953 bc7cb1a1 2003-11-23 devnull exits(0);
954 bc7cb1a1 2003-11-23 devnull }
955 bc7cb1a1 2003-11-23 devnull
956 bc7cb1a1 2003-11-23 devnull void
957 bc7cb1a1 2003-11-23 devnull onquit(int sig)
958 bc7cb1a1 2003-11-23 devnull {
959 bc7cb1a1 2003-11-23 devnull USED(sig);
960 bc7cb1a1 2003-11-23 devnull quit();
961 bc7cb1a1 2003-11-23 devnull }
962 bc7cb1a1 2003-11-23 devnull
963 bc7cb1a1 2003-11-23 devnull void
964 bc7cb1a1 2003-11-23 devnull rdelete(int *ad1, int *ad2)
965 bc7cb1a1 2003-11-23 devnull {
966 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
967 bc7cb1a1 2003-11-23 devnull
968 bc7cb1a1 2003-11-23 devnull a1 = ad1;
969 bc7cb1a1 2003-11-23 devnull a2 = ad2+1;
970 bc7cb1a1 2003-11-23 devnull a3 = dol;
971 bc7cb1a1 2003-11-23 devnull dol -= a2 - a1;
972 bc7cb1a1 2003-11-23 devnull do {
973 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
974 bc7cb1a1 2003-11-23 devnull } while(a2 <= a3);
975 bc7cb1a1 2003-11-23 devnull a1 = ad1;
976 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
977 bc7cb1a1 2003-11-23 devnull a1 = dol;
978 bc7cb1a1 2003-11-23 devnull dot = a1;
979 bc7cb1a1 2003-11-23 devnull fchange = 1;
980 bc7cb1a1 2003-11-23 devnull }
981 bc7cb1a1 2003-11-23 devnull
982 bc7cb1a1 2003-11-23 devnull void
983 bc7cb1a1 2003-11-23 devnull gdelete(void)
984 bc7cb1a1 2003-11-23 devnull {
985 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
986 bc7cb1a1 2003-11-23 devnull
987 bc7cb1a1 2003-11-23 devnull a3 = dol;
988 bc7cb1a1 2003-11-23 devnull for(a1=zero; (*a1&01)==0; a1++)
989 bc7cb1a1 2003-11-23 devnull if(a1>=a3)
990 bc7cb1a1 2003-11-23 devnull return;
991 bc7cb1a1 2003-11-23 devnull for(a2=a1+1; a2<=a3;) {
992 bc7cb1a1 2003-11-23 devnull if(*a2 & 01) {
993 bc7cb1a1 2003-11-23 devnull a2++;
994 bc7cb1a1 2003-11-23 devnull dot = a1;
995 bc7cb1a1 2003-11-23 devnull } else
996 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
997 bc7cb1a1 2003-11-23 devnull }
998 bc7cb1a1 2003-11-23 devnull dol = a1-1;
999 bc7cb1a1 2003-11-23 devnull if(dot > dol)
1000 bc7cb1a1 2003-11-23 devnull dot = dol;
1001 bc7cb1a1 2003-11-23 devnull fchange = 1;
1002 bc7cb1a1 2003-11-23 devnull }
1003 bc7cb1a1 2003-11-23 devnull
1004 bc7cb1a1 2003-11-23 devnull Rune*
1005 bc7cb1a1 2003-11-23 devnull getline(int tl)
1006 bc7cb1a1 2003-11-23 devnull {
1007 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1008 bc7cb1a1 2003-11-23 devnull int nl;
1009 bc7cb1a1 2003-11-23 devnull
1010 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1011 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OREAD);
1012 bc7cb1a1 2003-11-23 devnull nl = nleft;
1013 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2) - 1);
1014 bc7cb1a1 2003-11-23 devnull while(*lp++ = *bp++) {
1015 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1016 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1017 bc7cb1a1 2003-11-23 devnull bp = getblock(tl += BLKSIZE/2, OREAD);
1018 bc7cb1a1 2003-11-23 devnull nl = nleft;
1019 bc7cb1a1 2003-11-23 devnull }
1020 bc7cb1a1 2003-11-23 devnull }
1021 bc7cb1a1 2003-11-23 devnull return linebuf;
1022 bc7cb1a1 2003-11-23 devnull }
1023 bc7cb1a1 2003-11-23 devnull
1024 bc7cb1a1 2003-11-23 devnull int
1025 bc7cb1a1 2003-11-23 devnull putline(void)
1026 bc7cb1a1 2003-11-23 devnull {
1027 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1028 bc7cb1a1 2003-11-23 devnull int nl, tl;
1029 bc7cb1a1 2003-11-23 devnull
1030 bc7cb1a1 2003-11-23 devnull fchange = 1;
1031 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1032 bc7cb1a1 2003-11-23 devnull tl = tline;
1033 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1034 bc7cb1a1 2003-11-23 devnull nl = nleft;
1035 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2)-1);
1036 bc7cb1a1 2003-11-23 devnull while(*bp = *lp++) {
1037 bc7cb1a1 2003-11-23 devnull if(*bp++ == '\n') {
1038 bc7cb1a1 2003-11-23 devnull bp[-1] = 0;
1039 bc7cb1a1 2003-11-23 devnull linebp = lp;
1040 bc7cb1a1 2003-11-23 devnull break;
1041 bc7cb1a1 2003-11-23 devnull }
1042 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1043 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1044 bc7cb1a1 2003-11-23 devnull tl += BLKSIZE/2;
1045 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1046 bc7cb1a1 2003-11-23 devnull nl = nleft;
1047 bc7cb1a1 2003-11-23 devnull }
1048 bc7cb1a1 2003-11-23 devnull }
1049 bc7cb1a1 2003-11-23 devnull nl = tline;
1050 bc7cb1a1 2003-11-23 devnull tline += ((lp-linebuf) + 03) & 077776;
1051 bc7cb1a1 2003-11-23 devnull return nl;
1052 bc7cb1a1 2003-11-23 devnull }
1053 bc7cb1a1 2003-11-23 devnull
1054 bc7cb1a1 2003-11-23 devnull void
1055 bc7cb1a1 2003-11-23 devnull blkio(int b, uchar *buf, int isread)
1056 bc7cb1a1 2003-11-23 devnull {
1057 bc7cb1a1 2003-11-23 devnull int n;
1058 bc7cb1a1 2003-11-23 devnull
1059 bc7cb1a1 2003-11-23 devnull seek(tfile, b*BLKSIZE, 0);
1060 bc7cb1a1 2003-11-23 devnull if(isread)
1061 bc7cb1a1 2003-11-23 devnull n = read(tfile, buf, BLKSIZE);
1062 bc7cb1a1 2003-11-23 devnull else
1063 bc7cb1a1 2003-11-23 devnull n = write(tfile, buf, BLKSIZE);
1064 bc7cb1a1 2003-11-23 devnull if(n != BLKSIZE)
1065 bc7cb1a1 2003-11-23 devnull error(T);
1066 bc7cb1a1 2003-11-23 devnull }
1067 bc7cb1a1 2003-11-23 devnull
1068 bc7cb1a1 2003-11-23 devnull Rune*
1069 bc7cb1a1 2003-11-23 devnull getblock(int atl, int iof)
1070 bc7cb1a1 2003-11-23 devnull {
1071 bc7cb1a1 2003-11-23 devnull int bno, off;
1072 bc7cb1a1 2003-11-23 devnull
1073 bc7cb1a1 2003-11-23 devnull static uchar ibuff[BLKSIZE];
1074 bc7cb1a1 2003-11-23 devnull static uchar obuff[BLKSIZE];
1075 bc7cb1a1 2003-11-23 devnull
1076 bc7cb1a1 2003-11-23 devnull bno = atl / (BLKSIZE/2);
1077 bc7cb1a1 2003-11-23 devnull off = (atl<<1) & (BLKSIZE-1) & ~03;
1078 bc7cb1a1 2003-11-23 devnull if(bno >= NBLK) {
1079 bc7cb1a1 2003-11-23 devnull lastc = '\n';
1080 bc7cb1a1 2003-11-23 devnull error(T);
1081 bc7cb1a1 2003-11-23 devnull }
1082 bc7cb1a1 2003-11-23 devnull nleft = BLKSIZE - off;
1083 bc7cb1a1 2003-11-23 devnull if(bno == iblock) {
1084 bc7cb1a1 2003-11-23 devnull ichanged |= iof;
1085 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1086 bc7cb1a1 2003-11-23 devnull }
1087 bc7cb1a1 2003-11-23 devnull if(bno == oblock)
1088 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1089 bc7cb1a1 2003-11-23 devnull if(iof == OREAD) {
1090 bc7cb1a1 2003-11-23 devnull if(ichanged)
1091 bc7cb1a1 2003-11-23 devnull blkio(iblock, ibuff, 0);
1092 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1093 bc7cb1a1 2003-11-23 devnull iblock = bno;
1094 bc7cb1a1 2003-11-23 devnull blkio(bno, ibuff, 1);
1095 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1096 bc7cb1a1 2003-11-23 devnull }
1097 bc7cb1a1 2003-11-23 devnull if(oblock >= 0)
1098 bc7cb1a1 2003-11-23 devnull blkio(oblock, obuff, 0);
1099 bc7cb1a1 2003-11-23 devnull oblock = bno;
1100 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1101 bc7cb1a1 2003-11-23 devnull }
1102 bc7cb1a1 2003-11-23 devnull
1103 bc7cb1a1 2003-11-23 devnull void
1104 bc7cb1a1 2003-11-23 devnull init(void)
1105 bc7cb1a1 2003-11-23 devnull {
1106 bc7cb1a1 2003-11-23 devnull int *markp;
1107 bc7cb1a1 2003-11-23 devnull
1108 bc7cb1a1 2003-11-23 devnull close(tfile);
1109 bc7cb1a1 2003-11-23 devnull tline = 2;
1110 bc7cb1a1 2003-11-23 devnull for(markp = names; markp < &names[26]; )
1111 bc7cb1a1 2003-11-23 devnull *markp++ = 0;
1112 bc7cb1a1 2003-11-23 devnull subnewa = 0;
1113 bc7cb1a1 2003-11-23 devnull anymarks = 0;
1114 bc7cb1a1 2003-11-23 devnull iblock = -1;
1115 bc7cb1a1 2003-11-23 devnull oblock = -1;
1116 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1117 bc7cb1a1 2003-11-23 devnull if((tfile = create(tfname, ORDWR, 0600)) < 0){
1118 bc7cb1a1 2003-11-23 devnull error1(T);
1119 bc7cb1a1 2003-11-23 devnull exits(0);
1120 bc7cb1a1 2003-11-23 devnull }
1121 bc7cb1a1 2003-11-23 devnull dot = dol = zero;
1122 bc7cb1a1 2003-11-23 devnull }
1123 bc7cb1a1 2003-11-23 devnull
1124 bc7cb1a1 2003-11-23 devnull void
1125 bc7cb1a1 2003-11-23 devnull global(int k)
1126 bc7cb1a1 2003-11-23 devnull {
1127 bc7cb1a1 2003-11-23 devnull Rune *gp, globuf[GBSIZE];
1128 bc7cb1a1 2003-11-23 devnull int c, *a1;
1129 bc7cb1a1 2003-11-23 devnull
1130 bc7cb1a1 2003-11-23 devnull if(globp)
1131 bc7cb1a1 2003-11-23 devnull error(Q);
1132 bc7cb1a1 2003-11-23 devnull setwide();
1133 bc7cb1a1 2003-11-23 devnull squeeze(dol > zero);
1134 bc7cb1a1 2003-11-23 devnull c = getchr();
1135 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1136 bc7cb1a1 2003-11-23 devnull error(Q);
1137 bc7cb1a1 2003-11-23 devnull compile(c);
1138 bc7cb1a1 2003-11-23 devnull gp = globuf;
1139 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != '\n') {
1140 bc7cb1a1 2003-11-23 devnull if(c == EOF)
1141 bc7cb1a1 2003-11-23 devnull error(Q);
1142 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1143 bc7cb1a1 2003-11-23 devnull c = getchr();
1144 bc7cb1a1 2003-11-23 devnull if(c != '\n')
1145 bc7cb1a1 2003-11-23 devnull *gp++ = '\\';
1146 bc7cb1a1 2003-11-23 devnull }
1147 bc7cb1a1 2003-11-23 devnull *gp++ = c;
1148 bc7cb1a1 2003-11-23 devnull if(gp >= &globuf[GBSIZE-2])
1149 bc7cb1a1 2003-11-23 devnull error(Q);
1150 bc7cb1a1 2003-11-23 devnull }
1151 bc7cb1a1 2003-11-23 devnull if(gp == globuf)
1152 bc7cb1a1 2003-11-23 devnull *gp++ = 'p';
1153 bc7cb1a1 2003-11-23 devnull *gp++ = '\n';
1154 bc7cb1a1 2003-11-23 devnull *gp = 0;
1155 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1156 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1157 bc7cb1a1 2003-11-23 devnull if(a1 >= addr1 && a1 <= addr2 && match(a1) == k)
1158 bc7cb1a1 2003-11-23 devnull *a1 |= 01;
1159 bc7cb1a1 2003-11-23 devnull }
1160 bc7cb1a1 2003-11-23 devnull
1161 bc7cb1a1 2003-11-23 devnull /*
1162 bc7cb1a1 2003-11-23 devnull * Special case: g/.../d (avoid n^2 algorithm)
1163 bc7cb1a1 2003-11-23 devnull */
1164 bc7cb1a1 2003-11-23 devnull if(globuf[0] == 'd' && globuf[1] == '\n' && globuf[2] == 0) {
1165 bc7cb1a1 2003-11-23 devnull gdelete();
1166 bc7cb1a1 2003-11-23 devnull return;
1167 bc7cb1a1 2003-11-23 devnull }
1168 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1169 bc7cb1a1 2003-11-23 devnull if(*a1 & 01) {
1170 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1171 bc7cb1a1 2003-11-23 devnull dot = a1;
1172 bc7cb1a1 2003-11-23 devnull globp = globuf;
1173 bc7cb1a1 2003-11-23 devnull commands();
1174 bc7cb1a1 2003-11-23 devnull a1 = zero;
1175 bc7cb1a1 2003-11-23 devnull }
1176 bc7cb1a1 2003-11-23 devnull }
1177 bc7cb1a1 2003-11-23 devnull }
1178 bc7cb1a1 2003-11-23 devnull
1179 bc7cb1a1 2003-11-23 devnull void
1180 bc7cb1a1 2003-11-23 devnull join(void)
1181 bc7cb1a1 2003-11-23 devnull {
1182 bc7cb1a1 2003-11-23 devnull Rune *gp, *lp;
1183 bc7cb1a1 2003-11-23 devnull int *a1;
1184 bc7cb1a1 2003-11-23 devnull
1185 bc7cb1a1 2003-11-23 devnull nonzero();
1186 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1187 bc7cb1a1 2003-11-23 devnull for(a1=addr1; a1<=addr2; a1++) {
1188 bc7cb1a1 2003-11-23 devnull lp = getline(*a1);
1189 bc7cb1a1 2003-11-23 devnull while(*gp = *lp++)
1190 bc7cb1a1 2003-11-23 devnull if(gp++ >= &genbuf[LBSIZE-2])
1191 bc7cb1a1 2003-11-23 devnull error(Q);
1192 bc7cb1a1 2003-11-23 devnull }
1193 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1194 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1195 bc7cb1a1 2003-11-23 devnull while(*lp++ = *gp++)
1196 bc7cb1a1 2003-11-23 devnull ;
1197 bc7cb1a1 2003-11-23 devnull *addr1 = putline();
1198 bc7cb1a1 2003-11-23 devnull if(addr1 < addr2)
1199 bc7cb1a1 2003-11-23 devnull rdelete(addr1+1, addr2);
1200 bc7cb1a1 2003-11-23 devnull dot = addr1;
1201 bc7cb1a1 2003-11-23 devnull }
1202 bc7cb1a1 2003-11-23 devnull
1203 bc7cb1a1 2003-11-23 devnull void
1204 bc7cb1a1 2003-11-23 devnull substitute(int inglob)
1205 bc7cb1a1 2003-11-23 devnull {
1206 bc7cb1a1 2003-11-23 devnull int *mp, *a1, nl, gsubf, n;
1207 bc7cb1a1 2003-11-23 devnull
1208 bc7cb1a1 2003-11-23 devnull n = getnum(); /* OK even if n==0 */
1209 bc7cb1a1 2003-11-23 devnull gsubf = compsub();
1210 bc7cb1a1 2003-11-23 devnull for(a1 = addr1; a1 <= addr2; a1++) {
1211 bc7cb1a1 2003-11-23 devnull if(match(a1)){
1212 bc7cb1a1 2003-11-23 devnull int *ozero;
1213 bc7cb1a1 2003-11-23 devnull int m = n;
1214 bc7cb1a1 2003-11-23 devnull
1215 bc7cb1a1 2003-11-23 devnull do {
1216 bc7cb1a1 2003-11-23 devnull int span = loc2-loc1;
1217 bc7cb1a1 2003-11-23 devnull
1218 bc7cb1a1 2003-11-23 devnull if(--m <= 0) {
1219 bc7cb1a1 2003-11-23 devnull dosub();
1220 bc7cb1a1 2003-11-23 devnull if(!gsubf)
1221 bc7cb1a1 2003-11-23 devnull break;
1222 bc7cb1a1 2003-11-23 devnull if(span == 0) { /* null RE match */
1223 bc7cb1a1 2003-11-23 devnull if(*loc2 == 0)
1224 bc7cb1a1 2003-11-23 devnull break;
1225 bc7cb1a1 2003-11-23 devnull loc2++;
1226 bc7cb1a1 2003-11-23 devnull }
1227 bc7cb1a1 2003-11-23 devnull }
1228 bc7cb1a1 2003-11-23 devnull } while(match(0));
1229 bc7cb1a1 2003-11-23 devnull if(m <= 0) {
1230 bc7cb1a1 2003-11-23 devnull inglob |= 01;
1231 bc7cb1a1 2003-11-23 devnull subnewa = putline();
1232 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1233 bc7cb1a1 2003-11-23 devnull if(anymarks) {
1234 bc7cb1a1 2003-11-23 devnull for(mp=names; mp<&names[26]; mp++)
1235 bc7cb1a1 2003-11-23 devnull if(*mp == *a1)
1236 bc7cb1a1 2003-11-23 devnull *mp = subnewa;
1237 bc7cb1a1 2003-11-23 devnull }
1238 bc7cb1a1 2003-11-23 devnull subolda = *a1;
1239 bc7cb1a1 2003-11-23 devnull *a1 = subnewa;
1240 bc7cb1a1 2003-11-23 devnull ozero = zero;
1241 bc7cb1a1 2003-11-23 devnull nl = append(getsub, a1);
1242 bc7cb1a1 2003-11-23 devnull addr2 += nl;
1243 bc7cb1a1 2003-11-23 devnull nl += zero-ozero;
1244 bc7cb1a1 2003-11-23 devnull a1 += nl;
1245 bc7cb1a1 2003-11-23 devnull }
1246 bc7cb1a1 2003-11-23 devnull }
1247 bc7cb1a1 2003-11-23 devnull }
1248 bc7cb1a1 2003-11-23 devnull if(inglob == 0)
1249 bc7cb1a1 2003-11-23 devnull error(Q);
1250 bc7cb1a1 2003-11-23 devnull }
1251 bc7cb1a1 2003-11-23 devnull
1252 bc7cb1a1 2003-11-23 devnull int
1253 bc7cb1a1 2003-11-23 devnull compsub(void)
1254 bc7cb1a1 2003-11-23 devnull {
1255 bc7cb1a1 2003-11-23 devnull int seof, c;
1256 bc7cb1a1 2003-11-23 devnull Rune *p;
1257 bc7cb1a1 2003-11-23 devnull
1258 bc7cb1a1 2003-11-23 devnull seof = getchr();
1259 bc7cb1a1 2003-11-23 devnull if(seof == '\n' || seof == ' ')
1260 bc7cb1a1 2003-11-23 devnull error(Q);
1261 bc7cb1a1 2003-11-23 devnull compile(seof);
1262 bc7cb1a1 2003-11-23 devnull p = rhsbuf;
1263 bc7cb1a1 2003-11-23 devnull for(;;) {
1264 bc7cb1a1 2003-11-23 devnull c = getchr();
1265 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1266 bc7cb1a1 2003-11-23 devnull c = getchr();
1267 bc7cb1a1 2003-11-23 devnull *p++ = ESCFLG;
1268 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1269 bc7cb1a1 2003-11-23 devnull error(Q);
1270 bc7cb1a1 2003-11-23 devnull } else
1271 bc7cb1a1 2003-11-23 devnull if(c == '\n' && (!globp || !globp[0])) {
1272 bc7cb1a1 2003-11-23 devnull peekc = c;
1273 bc7cb1a1 2003-11-23 devnull pflag++;
1274 bc7cb1a1 2003-11-23 devnull break;
1275 bc7cb1a1 2003-11-23 devnull } else
1276 bc7cb1a1 2003-11-23 devnull if(c == seof)
1277 bc7cb1a1 2003-11-23 devnull break;
1278 bc7cb1a1 2003-11-23 devnull *p++ = c;
1279 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1280 bc7cb1a1 2003-11-23 devnull error(Q);
1281 bc7cb1a1 2003-11-23 devnull }
1282 bc7cb1a1 2003-11-23 devnull *p = 0;
1283 bc7cb1a1 2003-11-23 devnull peekc = getchr();
1284 bc7cb1a1 2003-11-23 devnull if(peekc == 'g') {
1285 bc7cb1a1 2003-11-23 devnull peekc = 0;
1286 bc7cb1a1 2003-11-23 devnull newline();
1287 bc7cb1a1 2003-11-23 devnull return 1;
1288 bc7cb1a1 2003-11-23 devnull }
1289 bc7cb1a1 2003-11-23 devnull newline();
1290 bc7cb1a1 2003-11-23 devnull return 0;
1291 bc7cb1a1 2003-11-23 devnull }
1292 bc7cb1a1 2003-11-23 devnull
1293 bc7cb1a1 2003-11-23 devnull int
1294 bc7cb1a1 2003-11-23 devnull getsub(void)
1295 bc7cb1a1 2003-11-23 devnull {
1296 bc7cb1a1 2003-11-23 devnull Rune *p1, *p2;
1297 bc7cb1a1 2003-11-23 devnull
1298 bc7cb1a1 2003-11-23 devnull p1 = linebuf;
1299 bc7cb1a1 2003-11-23 devnull if((p2 = linebp) == 0)
1300 bc7cb1a1 2003-11-23 devnull return EOF;
1301 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
1302 bc7cb1a1 2003-11-23 devnull ;
1303 bc7cb1a1 2003-11-23 devnull linebp = 0;
1304 bc7cb1a1 2003-11-23 devnull return 0;
1305 bc7cb1a1 2003-11-23 devnull }
1306 bc7cb1a1 2003-11-23 devnull
1307 bc7cb1a1 2003-11-23 devnull void
1308 bc7cb1a1 2003-11-23 devnull dosub(void)
1309 bc7cb1a1 2003-11-23 devnull {
1310 bc7cb1a1 2003-11-23 devnull Rune *lp, *sp, *rp;
1311 bc7cb1a1 2003-11-23 devnull int c, n;
1312 bc7cb1a1 2003-11-23 devnull
1313 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1314 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1315 bc7cb1a1 2003-11-23 devnull rp = rhsbuf;
1316 bc7cb1a1 2003-11-23 devnull while(lp < loc1)
1317 bc7cb1a1 2003-11-23 devnull *sp++ = *lp++;
1318 bc7cb1a1 2003-11-23 devnull while(c = *rp++) {
1319 bc7cb1a1 2003-11-23 devnull if(c == '&'){
1320 bc7cb1a1 2003-11-23 devnull sp = place(sp, loc1, loc2);
1321 bc7cb1a1 2003-11-23 devnull continue;
1322 bc7cb1a1 2003-11-23 devnull }
1323 bc7cb1a1 2003-11-23 devnull if(c == ESCFLG && (c = *rp++) >= '1' && c < MAXSUB+'0') {
1324 bc7cb1a1 2003-11-23 devnull n = c-'0';
1325 bc7cb1a1 2003-11-23 devnull if(subexp[n].s.rsp && subexp[n].e.rep) {
1326 bc7cb1a1 2003-11-23 devnull sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep);
1327 bc7cb1a1 2003-11-23 devnull continue;
1328 bc7cb1a1 2003-11-23 devnull }
1329 bc7cb1a1 2003-11-23 devnull error(Q);
1330 bc7cb1a1 2003-11-23 devnull }
1331 bc7cb1a1 2003-11-23 devnull *sp++ = c;
1332 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1333 bc7cb1a1 2003-11-23 devnull error(Q);
1334 bc7cb1a1 2003-11-23 devnull }
1335 bc7cb1a1 2003-11-23 devnull lp = loc2;
1336 bc7cb1a1 2003-11-23 devnull loc2 = sp - genbuf + linebuf;
1337 bc7cb1a1 2003-11-23 devnull while(*sp++ = *lp++)
1338 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1339 bc7cb1a1 2003-11-23 devnull error(Q);
1340 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1341 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1342 bc7cb1a1 2003-11-23 devnull while(*lp++ = *sp++)
1343 bc7cb1a1 2003-11-23 devnull ;
1344 bc7cb1a1 2003-11-23 devnull }
1345 bc7cb1a1 2003-11-23 devnull
1346 bc7cb1a1 2003-11-23 devnull Rune*
1347 bc7cb1a1 2003-11-23 devnull place(Rune *sp, Rune *l1, Rune *l2)
1348 bc7cb1a1 2003-11-23 devnull {
1349 bc7cb1a1 2003-11-23 devnull
1350 bc7cb1a1 2003-11-23 devnull while(l1 < l2) {
1351 bc7cb1a1 2003-11-23 devnull *sp++ = *l1++;
1352 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1353 bc7cb1a1 2003-11-23 devnull error(Q);
1354 bc7cb1a1 2003-11-23 devnull }
1355 bc7cb1a1 2003-11-23 devnull return sp;
1356 bc7cb1a1 2003-11-23 devnull }
1357 bc7cb1a1 2003-11-23 devnull
1358 bc7cb1a1 2003-11-23 devnull void
1359 bc7cb1a1 2003-11-23 devnull move(int cflag)
1360 bc7cb1a1 2003-11-23 devnull {
1361 bc7cb1a1 2003-11-23 devnull int *adt, *ad1, *ad2;
1362 bc7cb1a1 2003-11-23 devnull
1363 bc7cb1a1 2003-11-23 devnull nonzero();
1364 bc7cb1a1 2003-11-23 devnull if((adt = address())==0) /* address() guarantees addr is in range */
1365 bc7cb1a1 2003-11-23 devnull error(Q);
1366 bc7cb1a1 2003-11-23 devnull newline();
1367 bc7cb1a1 2003-11-23 devnull if(cflag) {
1368 bc7cb1a1 2003-11-23 devnull int *ozero, delta;
1369 bc7cb1a1 2003-11-23 devnull ad1 = dol;
1370 bc7cb1a1 2003-11-23 devnull ozero = zero;
1371 bc7cb1a1 2003-11-23 devnull append(getcopy, ad1++);
1372 bc7cb1a1 2003-11-23 devnull ad2 = dol;
1373 bc7cb1a1 2003-11-23 devnull delta = zero - ozero;
1374 bc7cb1a1 2003-11-23 devnull ad1 += delta;
1375 bc7cb1a1 2003-11-23 devnull adt += delta;
1376 bc7cb1a1 2003-11-23 devnull } else {
1377 bc7cb1a1 2003-11-23 devnull ad2 = addr2;
1378 bc7cb1a1 2003-11-23 devnull for(ad1 = addr1; ad1 <= ad2;)
1379 bc7cb1a1 2003-11-23 devnull *ad1++ &= ~01;
1380 bc7cb1a1 2003-11-23 devnull ad1 = addr1;
1381 bc7cb1a1 2003-11-23 devnull }
1382 bc7cb1a1 2003-11-23 devnull ad2++;
1383 bc7cb1a1 2003-11-23 devnull if(adt<ad1) {
1384 bc7cb1a1 2003-11-23 devnull dot = adt + (ad2-ad1);
1385 bc7cb1a1 2003-11-23 devnull if((++adt)==ad1)
1386 bc7cb1a1 2003-11-23 devnull return;
1387 bc7cb1a1 2003-11-23 devnull reverse(adt, ad1);
1388 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1389 bc7cb1a1 2003-11-23 devnull reverse(adt, ad2);
1390 bc7cb1a1 2003-11-23 devnull } else
1391 bc7cb1a1 2003-11-23 devnull if(adt >= ad2) {
1392 bc7cb1a1 2003-11-23 devnull dot = adt++;
1393 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1394 bc7cb1a1 2003-11-23 devnull reverse(ad2, adt);
1395 bc7cb1a1 2003-11-23 devnull reverse(ad1, adt);
1396 bc7cb1a1 2003-11-23 devnull } else
1397 bc7cb1a1 2003-11-23 devnull error(Q);
1398 bc7cb1a1 2003-11-23 devnull fchange = 1;
1399 bc7cb1a1 2003-11-23 devnull }
1400 bc7cb1a1 2003-11-23 devnull
1401 bc7cb1a1 2003-11-23 devnull void
1402 bc7cb1a1 2003-11-23 devnull reverse(int *a1, int *a2)
1403 bc7cb1a1 2003-11-23 devnull {
1404 bc7cb1a1 2003-11-23 devnull int t;
1405 bc7cb1a1 2003-11-23 devnull
1406 bc7cb1a1 2003-11-23 devnull for(;;) {
1407 bc7cb1a1 2003-11-23 devnull t = *--a2;
1408 bc7cb1a1 2003-11-23 devnull if(a2 <= a1)
1409 bc7cb1a1 2003-11-23 devnull return;
1410 bc7cb1a1 2003-11-23 devnull *a2 = *a1;
1411 bc7cb1a1 2003-11-23 devnull *a1++ = t;
1412 bc7cb1a1 2003-11-23 devnull }
1413 bc7cb1a1 2003-11-23 devnull }
1414 bc7cb1a1 2003-11-23 devnull
1415 bc7cb1a1 2003-11-23 devnull int
1416 bc7cb1a1 2003-11-23 devnull getcopy(void)
1417 bc7cb1a1 2003-11-23 devnull {
1418 bc7cb1a1 2003-11-23 devnull if(addr1 > addr2)
1419 bc7cb1a1 2003-11-23 devnull return EOF;
1420 bc7cb1a1 2003-11-23 devnull getline(*addr1++);
1421 bc7cb1a1 2003-11-23 devnull return 0;
1422 bc7cb1a1 2003-11-23 devnull }
1423 bc7cb1a1 2003-11-23 devnull
1424 bc7cb1a1 2003-11-23 devnull void
1425 bc7cb1a1 2003-11-23 devnull compile(int eof)
1426 bc7cb1a1 2003-11-23 devnull {
1427 bc7cb1a1 2003-11-23 devnull Rune c;
1428 bc7cb1a1 2003-11-23 devnull char *ep;
1429 bc7cb1a1 2003-11-23 devnull char expbuf[ESIZE];
1430 bc7cb1a1 2003-11-23 devnull
1431 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1432 bc7cb1a1 2003-11-23 devnull peekc = c;
1433 bc7cb1a1 2003-11-23 devnull c = eof;
1434 bc7cb1a1 2003-11-23 devnull }
1435 bc7cb1a1 2003-11-23 devnull if(c == eof) {
1436 bc7cb1a1 2003-11-23 devnull if(!pattern)
1437 bc7cb1a1 2003-11-23 devnull error(Q);
1438 bc7cb1a1 2003-11-23 devnull return;
1439 bc7cb1a1 2003-11-23 devnull }
1440 bc7cb1a1 2003-11-23 devnull if(pattern) {
1441 bc7cb1a1 2003-11-23 devnull free(pattern);
1442 bc7cb1a1 2003-11-23 devnull pattern = 0;
1443 bc7cb1a1 2003-11-23 devnull }
1444 bc7cb1a1 2003-11-23 devnull ep = expbuf;
1445 bc7cb1a1 2003-11-23 devnull do {
1446 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1447 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1448 bc7cb1a1 2003-11-23 devnull error(Q);
1449 bc7cb1a1 2003-11-23 devnull return;
1450 bc7cb1a1 2003-11-23 devnull }
1451 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1452 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1453 bc7cb1a1 2003-11-23 devnull error(Q);
1454 bc7cb1a1 2003-11-23 devnull return;
1455 bc7cb1a1 2003-11-23 devnull }
1456 bc7cb1a1 2003-11-23 devnull }
1457 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1458 bc7cb1a1 2003-11-23 devnull error(Q);
1459 bc7cb1a1 2003-11-23 devnull return;
1460 bc7cb1a1 2003-11-23 devnull }
1461 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1462 bc7cb1a1 2003-11-23 devnull } while((c = getchr()) != eof && c != '\n');
1463 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1464 bc7cb1a1 2003-11-23 devnull peekc = c;
1465 bc7cb1a1 2003-11-23 devnull *ep = 0;
1466 bc7cb1a1 2003-11-23 devnull pattern = regcomp(expbuf);
1467 bc7cb1a1 2003-11-23 devnull }
1468 bc7cb1a1 2003-11-23 devnull
1469 bc7cb1a1 2003-11-23 devnull int
1470 bc7cb1a1 2003-11-23 devnull match(int *addr)
1471 bc7cb1a1 2003-11-23 devnull {
1472 bc7cb1a1 2003-11-23 devnull if(!pattern)
1473 bc7cb1a1 2003-11-23 devnull return 0;
1474 bc7cb1a1 2003-11-23 devnull if(addr){
1475 bc7cb1a1 2003-11-23 devnull if(addr == zero)
1476 bc7cb1a1 2003-11-23 devnull return 0;
1477 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = getline(*addr);
1478 bc7cb1a1 2003-11-23 devnull } else
1479 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = loc2;
1480 bc7cb1a1 2003-11-23 devnull subexp[0].e.rep = 0;
1481 bc7cb1a1 2003-11-23 devnull if(rregexec(pattern, linebuf, subexp, MAXSUB)) {
1482 bc7cb1a1 2003-11-23 devnull loc1 = subexp[0].s.rsp;
1483 bc7cb1a1 2003-11-23 devnull loc2 = subexp[0].e.rep;
1484 bc7cb1a1 2003-11-23 devnull return 1;
1485 bc7cb1a1 2003-11-23 devnull }
1486 bc7cb1a1 2003-11-23 devnull loc1 = loc2 = 0;
1487 bc7cb1a1 2003-11-23 devnull return 0;
1488 bc7cb1a1 2003-11-23 devnull
1489 bc7cb1a1 2003-11-23 devnull }
1490 bc7cb1a1 2003-11-23 devnull
1491 bc7cb1a1 2003-11-23 devnull void
1492 bc7cb1a1 2003-11-23 devnull putd(void)
1493 bc7cb1a1 2003-11-23 devnull {
1494 bc7cb1a1 2003-11-23 devnull int r;
1495 bc7cb1a1 2003-11-23 devnull
1496 bc7cb1a1 2003-11-23 devnull r = count%10;
1497 bc7cb1a1 2003-11-23 devnull count /= 10;
1498 bc7cb1a1 2003-11-23 devnull if(count)
1499 bc7cb1a1 2003-11-23 devnull putd();
1500 bc7cb1a1 2003-11-23 devnull putchr(r + L'0');
1501 bc7cb1a1 2003-11-23 devnull }
1502 bc7cb1a1 2003-11-23 devnull
1503 bc7cb1a1 2003-11-23 devnull void
1504 bc7cb1a1 2003-11-23 devnull putst(char *sp)
1505 bc7cb1a1 2003-11-23 devnull {
1506 bc7cb1a1 2003-11-23 devnull Rune r;
1507 bc7cb1a1 2003-11-23 devnull
1508 bc7cb1a1 2003-11-23 devnull col = 0;
1509 bc7cb1a1 2003-11-23 devnull for(;;) {
1510 bc7cb1a1 2003-11-23 devnull sp += chartorune(&r, sp);
1511 bc7cb1a1 2003-11-23 devnull if(r == 0)
1512 bc7cb1a1 2003-11-23 devnull break;
1513 bc7cb1a1 2003-11-23 devnull putchr(r);
1514 bc7cb1a1 2003-11-23 devnull }
1515 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
1516 bc7cb1a1 2003-11-23 devnull }
1517 bc7cb1a1 2003-11-23 devnull
1518 bc7cb1a1 2003-11-23 devnull void
1519 bc7cb1a1 2003-11-23 devnull putshst(Rune *sp)
1520 bc7cb1a1 2003-11-23 devnull {
1521 bc7cb1a1 2003-11-23 devnull col = 0;
1522 bc7cb1a1 2003-11-23 devnull while(*sp)
1523 bc7cb1a1 2003-11-23 devnull putchr(*sp++);
1524 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
1525 bc7cb1a1 2003-11-23 devnull }
1526 bc7cb1a1 2003-11-23 devnull
1527 bc7cb1a1 2003-11-23 devnull void
1528 bc7cb1a1 2003-11-23 devnull putchr(int ac)
1529 bc7cb1a1 2003-11-23 devnull {
1530 bc7cb1a1 2003-11-23 devnull char *lp;
1531 bc7cb1a1 2003-11-23 devnull int c;
1532 bc7cb1a1 2003-11-23 devnull Rune rune;
1533 bc7cb1a1 2003-11-23 devnull
1534 bc7cb1a1 2003-11-23 devnull lp = linp;
1535 bc7cb1a1 2003-11-23 devnull c = ac;
1536 bc7cb1a1 2003-11-23 devnull if(listf) {
1537 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
1538 bc7cb1a1 2003-11-23 devnull if(linp != line && linp[-1] == ' ') {
1539 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1540 bc7cb1a1 2003-11-23 devnull *lp++ = 'n';
1541 bc7cb1a1 2003-11-23 devnull }
1542 bc7cb1a1 2003-11-23 devnull } else {
1543 bc7cb1a1 2003-11-23 devnull if(col > (72-6-2)) {
1544 bc7cb1a1 2003-11-23 devnull col = 8;
1545 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1546 bc7cb1a1 2003-11-23 devnull *lp++ = '\n';
1547 bc7cb1a1 2003-11-23 devnull *lp++ = '\t';
1548 bc7cb1a1 2003-11-23 devnull }
1549 bc7cb1a1 2003-11-23 devnull col++;
1550 bc7cb1a1 2003-11-23 devnull if(c=='\b' || c=='\t' || c=='\\') {
1551 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1552 bc7cb1a1 2003-11-23 devnull if(c == '\b')
1553 bc7cb1a1 2003-11-23 devnull c = 'b';
1554 bc7cb1a1 2003-11-23 devnull else
1555 bc7cb1a1 2003-11-23 devnull if(c == '\t')
1556 bc7cb1a1 2003-11-23 devnull c = 't';
1557 bc7cb1a1 2003-11-23 devnull col++;
1558 bc7cb1a1 2003-11-23 devnull } else
1559 bc7cb1a1 2003-11-23 devnull if(c<' ' || c>='\177') {
1560 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1561 bc7cb1a1 2003-11-23 devnull *lp++ = 'x';
1562 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>12];
1563 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>8&0xF];
1564 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>4&0xF];
1565 bc7cb1a1 2003-11-23 devnull c = hex[c&0xF];
1566 bc7cb1a1 2003-11-23 devnull col += 5;
1567 bc7cb1a1 2003-11-23 devnull }
1568 bc7cb1a1 2003-11-23 devnull }
1569 bc7cb1a1 2003-11-23 devnull }
1570 bc7cb1a1 2003-11-23 devnull
1571 bc7cb1a1 2003-11-23 devnull rune = c;
1572 bc7cb1a1 2003-11-23 devnull lp += runetochar(lp, &rune);
1573 bc7cb1a1 2003-11-23 devnull
1574 bc7cb1a1 2003-11-23 devnull if(c == '\n' || lp >= &line[sizeof(line)-5]) {
1575 bc7cb1a1 2003-11-23 devnull linp = line;
1576 bc7cb1a1 2003-11-23 devnull write(oflag? 2: 1, line, lp-line);
1577 bc7cb1a1 2003-11-23 devnull return;
1578 bc7cb1a1 2003-11-23 devnull }
1579 bc7cb1a1 2003-11-23 devnull linp = lp;
1580 bc7cb1a1 2003-11-23 devnull }
1581 bc7cb1a1 2003-11-23 devnull
1582 bc7cb1a1 2003-11-23 devnull char*
1583 bc7cb1a1 2003-11-23 devnull mktemp(char *as)
1584 bc7cb1a1 2003-11-23 devnull {
1585 bc7cb1a1 2003-11-23 devnull char *s;
1586 bc7cb1a1 2003-11-23 devnull unsigned pid;
1587 bc7cb1a1 2003-11-23 devnull int i;
1588 bc7cb1a1 2003-11-23 devnull
1589 bc7cb1a1 2003-11-23 devnull pid = getpid();
1590 bc7cb1a1 2003-11-23 devnull s = as;
1591 bc7cb1a1 2003-11-23 devnull while(*s++)
1592 bc7cb1a1 2003-11-23 devnull ;
1593 bc7cb1a1 2003-11-23 devnull s--;
1594 bc7cb1a1 2003-11-23 devnull while(*--s == 'X') {
1595 bc7cb1a1 2003-11-23 devnull *s = pid % 10 + '0';
1596 bc7cb1a1 2003-11-23 devnull pid /= 10;
1597 bc7cb1a1 2003-11-23 devnull }
1598 bc7cb1a1 2003-11-23 devnull s++;
1599 bc7cb1a1 2003-11-23 devnull i = 'a';
1600 bc7cb1a1 2003-11-23 devnull while(access(as, 0) != -1) {
1601 bc7cb1a1 2003-11-23 devnull if(i == 'z')
1602 bc7cb1a1 2003-11-23 devnull return "/";
1603 bc7cb1a1 2003-11-23 devnull *s = i++;
1604 bc7cb1a1 2003-11-23 devnull }
1605 bc7cb1a1 2003-11-23 devnull return as;
1606 bc7cb1a1 2003-11-23 devnull }
1607 bc7cb1a1 2003-11-23 devnull
1608 bc7cb1a1 2003-11-23 devnull void
1609 bc7cb1a1 2003-11-23 devnull regerror(char *s)
1610 bc7cb1a1 2003-11-23 devnull {
1611 bc7cb1a1 2003-11-23 devnull USED(s);
1612 bc7cb1a1 2003-11-23 devnull error(Q);
1613 bc7cb1a1 2003-11-23 devnull }