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 bc7cb1a1 2003-11-23 devnull
9 bc7cb1a1 2003-11-23 devnull enum
10 bc7cb1a1 2003-11-23 devnull {
11 bc7cb1a1 2003-11-23 devnull FNSIZE = 128, /* file name */
12 bc7cb1a1 2003-11-23 devnull LBSIZE = 4096, /* max line size */
13 bc7cb1a1 2003-11-23 devnull BLKSIZE = 4096, /* block size in temp file */
14 bc7cb1a1 2003-11-23 devnull NBLK = 8191, /* max size of temp file */
15 bc7cb1a1 2003-11-23 devnull ESIZE = 256, /* max size of reg exp */
16 bc7cb1a1 2003-11-23 devnull GBSIZE = 256, /* max size of global command */
17 bc7cb1a1 2003-11-23 devnull MAXSUB = 9, /* max number of sub reg exp */
18 bc7cb1a1 2003-11-23 devnull ESCFLG = 0xFFFF, /* escape Rune - user defined code */
19 bc7cb1a1 2003-11-23 devnull EOF = -1,
20 bc7cb1a1 2003-11-23 devnull };
21 bc7cb1a1 2003-11-23 devnull
22 bc7cb1a1 2003-11-23 devnull void (*oldhup)(int);
23 bc7cb1a1 2003-11-23 devnull void (*oldquit)(int);
24 bc7cb1a1 2003-11-23 devnull int* addr1;
25 bc7cb1a1 2003-11-23 devnull int* addr2;
26 bc7cb1a1 2003-11-23 devnull int anymarks;
27 bc7cb1a1 2003-11-23 devnull int col;
28 bc7cb1a1 2003-11-23 devnull long count;
29 bc7cb1a1 2003-11-23 devnull int* dol;
30 bc7cb1a1 2003-11-23 devnull int* dot;
31 bc7cb1a1 2003-11-23 devnull int fchange;
32 bc7cb1a1 2003-11-23 devnull char file[FNSIZE];
33 bc7cb1a1 2003-11-23 devnull Rune genbuf[LBSIZE];
34 bc7cb1a1 2003-11-23 devnull int given;
35 bc7cb1a1 2003-11-23 devnull Rune* globp;
36 bc7cb1a1 2003-11-23 devnull int iblock;
37 bc7cb1a1 2003-11-23 devnull int ichanged;
38 bc7cb1a1 2003-11-23 devnull int io;
39 bc7cb1a1 2003-11-23 devnull Biobuf iobuf;
40 bc7cb1a1 2003-11-23 devnull int lastc;
41 bc7cb1a1 2003-11-23 devnull char line[70];
42 bc7cb1a1 2003-11-23 devnull Rune* linebp;
43 bc7cb1a1 2003-11-23 devnull Rune linebuf[LBSIZE];
44 bc7cb1a1 2003-11-23 devnull int listf;
45 bc7cb1a1 2003-11-23 devnull int listn;
46 bc7cb1a1 2003-11-23 devnull Rune* loc1;
47 bc7cb1a1 2003-11-23 devnull Rune* loc2;
48 bc7cb1a1 2003-11-23 devnull int names[26];
49 bc7cb1a1 2003-11-23 devnull int nleft;
50 bc7cb1a1 2003-11-23 devnull int oblock;
51 bc7cb1a1 2003-11-23 devnull int oflag;
52 bc7cb1a1 2003-11-23 devnull Reprog *pattern;
53 bc7cb1a1 2003-11-23 devnull int peekc;
54 bc7cb1a1 2003-11-23 devnull int pflag;
55 bc7cb1a1 2003-11-23 devnull int rescuing;
56 bc7cb1a1 2003-11-23 devnull Rune rhsbuf[LBSIZE/2];
57 bc7cb1a1 2003-11-23 devnull char savedfile[FNSIZE];
58 bc7cb1a1 2003-11-23 devnull jmp_buf savej;
59 bc7cb1a1 2003-11-23 devnull int subnewa;
60 bc7cb1a1 2003-11-23 devnull int subolda;
61 bc7cb1a1 2003-11-23 devnull Resub subexp[MAXSUB];
62 bc7cb1a1 2003-11-23 devnull char* tfname;
63 bc7cb1a1 2003-11-23 devnull int tline;
64 bc7cb1a1 2003-11-23 devnull int waiting;
65 bc7cb1a1 2003-11-23 devnull int wrapp;
66 bc7cb1a1 2003-11-23 devnull int* zero;
67 bc7cb1a1 2003-11-23 devnull
68 bc7cb1a1 2003-11-23 devnull char Q[] = "";
69 bc7cb1a1 2003-11-23 devnull char T[] = "TMP";
70 bc7cb1a1 2003-11-23 devnull char WRERR[] = "WRITE ERROR";
71 bc7cb1a1 2003-11-23 devnull int bpagesize = 20;
72 bc7cb1a1 2003-11-23 devnull char hex[] = "0123456789abcdef";
73 bc7cb1a1 2003-11-23 devnull char* linp = line;
74 bc7cb1a1 2003-11-23 devnull ulong nlall = 128;
75 bc7cb1a1 2003-11-23 devnull int tfile = -1;
76 bc7cb1a1 2003-11-23 devnull int vflag = 1;
77 bc7cb1a1 2003-11-23 devnull
78 bc7cb1a1 2003-11-23 devnull void add(int);
79 bc7cb1a1 2003-11-23 devnull int* address(void);
80 bc7cb1a1 2003-11-23 devnull int append(int(*)(void), int*);
81 bc7cb1a1 2003-11-23 devnull void browse(void);
82 bc7cb1a1 2003-11-23 devnull void callunix(void);
83 bc7cb1a1 2003-11-23 devnull void commands(void);
84 bc7cb1a1 2003-11-23 devnull void compile(int);
85 bc7cb1a1 2003-11-23 devnull int compsub(void);
86 bc7cb1a1 2003-11-23 devnull void dosub(void);
87 bc7cb1a1 2003-11-23 devnull void error(char*);
88 bc7cb1a1 2003-11-23 devnull int match(int*);
89 bc7cb1a1 2003-11-23 devnull void exfile(int);
90 bc7cb1a1 2003-11-23 devnull void filename(int);
91 bc7cb1a1 2003-11-23 devnull Rune* getblock(int, int);
92 bc7cb1a1 2003-11-23 devnull int getchr(void);
93 bc7cb1a1 2003-11-23 devnull int getcopy(void);
94 bc7cb1a1 2003-11-23 devnull int getfile(void);
95 bc7cb1a1 2003-11-23 devnull Rune* getline(int);
96 bc7cb1a1 2003-11-23 devnull int getnum(void);
97 bc7cb1a1 2003-11-23 devnull int getsub(void);
98 bc7cb1a1 2003-11-23 devnull int gettty(void);
99 bc7cb1a1 2003-11-23 devnull void global(int);
100 bc7cb1a1 2003-11-23 devnull void init(void);
101 bc7cb1a1 2003-11-23 devnull void join(void);
102 bc7cb1a1 2003-11-23 devnull void move(int);
103 bc7cb1a1 2003-11-23 devnull void newline(void);
104 bc7cb1a1 2003-11-23 devnull void nonzero(void);
105 bc7cb1a1 2003-11-23 devnull void notifyf(void*, char*);
106 bc7cb1a1 2003-11-23 devnull Rune* place(Rune*, Rune*, Rune*);
107 bc7cb1a1 2003-11-23 devnull void printcom(void);
108 bc7cb1a1 2003-11-23 devnull void putchr(int);
109 bc7cb1a1 2003-11-23 devnull void putd(void);
110 bc7cb1a1 2003-11-23 devnull void putfile(void);
111 bc7cb1a1 2003-11-23 devnull int putline(void);
112 bc7cb1a1 2003-11-23 devnull void putshst(Rune*);
113 bc7cb1a1 2003-11-23 devnull void putst(char*);
114 bc7cb1a1 2003-11-23 devnull void quit(void);
115 bc7cb1a1 2003-11-23 devnull void rdelete(int*, int*);
116 bc7cb1a1 2003-11-23 devnull void regerror(char *);
117 bc7cb1a1 2003-11-23 devnull void reverse(int*, int*);
118 bc7cb1a1 2003-11-23 devnull void setnoaddr(void);
119 bc7cb1a1 2003-11-23 devnull void setwide(void);
120 bc7cb1a1 2003-11-23 devnull void squeeze(int);
121 bc7cb1a1 2003-11-23 devnull void substitute(int);
122 bc7cb1a1 2003-11-23 devnull
123 bc7cb1a1 2003-11-23 devnull Rune La[] = { 'a', 0 };
124 bc7cb1a1 2003-11-23 devnull Rune Lr[] = { 'r', 0 };
125 bc7cb1a1 2003-11-23 devnull
126 bc7cb1a1 2003-11-23 devnull char tmp[] = "/tmp/eXXXXX";
127 bc7cb1a1 2003-11-23 devnull
128 bc7cb1a1 2003-11-23 devnull void
129 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
130 bc7cb1a1 2003-11-23 devnull {
131 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
132 bc7cb1a1 2003-11-23 devnull
133 bc7cb1a1 2003-11-23 devnull notify(notifyf);
134 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
135 bc7cb1a1 2003-11-23 devnull case 'o':
136 bc7cb1a1 2003-11-23 devnull oflag = 1;
137 bc7cb1a1 2003-11-23 devnull vflag = 0;
138 bc7cb1a1 2003-11-23 devnull break;
139 bc7cb1a1 2003-11-23 devnull } ARGEND
140 bc7cb1a1 2003-11-23 devnull
141 bc7cb1a1 2003-11-23 devnull USED(argc);
142 bc7cb1a1 2003-11-23 devnull if(*argv && (strcmp(*argv, "-") == 0)) {
143 bc7cb1a1 2003-11-23 devnull argv++;
144 bc7cb1a1 2003-11-23 devnull vflag = 0;
145 bc7cb1a1 2003-11-23 devnull }
146 bc7cb1a1 2003-11-23 devnull if(oflag) {
147 bc7cb1a1 2003-11-23 devnull p1 = "/fd/1";
148 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
149 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
150 bc7cb1a1 2003-11-23 devnull ;
151 bc7cb1a1 2003-11-23 devnull globp = La;
152 bc7cb1a1 2003-11-23 devnull } else
153 bc7cb1a1 2003-11-23 devnull if(*argv) {
154 bc7cb1a1 2003-11-23 devnull p1 = *argv;
155 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
156 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
157 bc7cb1a1 2003-11-23 devnull if(p2 >= &savedfile[sizeof(savedfile)])
158 bc7cb1a1 2003-11-23 devnull p2--;
159 bc7cb1a1 2003-11-23 devnull globp = Lr;
160 bc7cb1a1 2003-11-23 devnull }
161 bc7cb1a1 2003-11-23 devnull zero = malloc((nlall+5)*sizeof(int*));
162 bc7cb1a1 2003-11-23 devnull tfname = mktemp(tmp);
163 bc7cb1a1 2003-11-23 devnull init();
164 bc7cb1a1 2003-11-23 devnull setjmp(savej);
165 bc7cb1a1 2003-11-23 devnull commands();
166 bc7cb1a1 2003-11-23 devnull quit();
167 bc7cb1a1 2003-11-23 devnull }
168 bc7cb1a1 2003-11-23 devnull
169 bc7cb1a1 2003-11-23 devnull void
170 bc7cb1a1 2003-11-23 devnull commands(void)
171 bc7cb1a1 2003-11-23 devnull {
172 bc7cb1a1 2003-11-23 devnull int *a1, c, temp;
173 bc7cb1a1 2003-11-23 devnull char lastsep;
174 bc7cb1a1 2003-11-23 devnull Dir *d;
175 bc7cb1a1 2003-11-23 devnull
176 bc7cb1a1 2003-11-23 devnull for(;;) {
177 bc7cb1a1 2003-11-23 devnull if(pflag) {
178 bc7cb1a1 2003-11-23 devnull pflag = 0;
179 bc7cb1a1 2003-11-23 devnull addr1 = addr2 = dot;
180 bc7cb1a1 2003-11-23 devnull printcom();
181 bc7cb1a1 2003-11-23 devnull }
182 bc7cb1a1 2003-11-23 devnull c = '\n';
183 bc7cb1a1 2003-11-23 devnull for(addr1 = 0;;) {
184 bc7cb1a1 2003-11-23 devnull lastsep = c;
185 bc7cb1a1 2003-11-23 devnull a1 = address();
186 bc7cb1a1 2003-11-23 devnull c = getchr();
187 bc7cb1a1 2003-11-23 devnull if(c != ',' && c != ';')
188 bc7cb1a1 2003-11-23 devnull break;
189 bc7cb1a1 2003-11-23 devnull if(lastsep == ',')
190 bc7cb1a1 2003-11-23 devnull error(Q);
191 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
192 bc7cb1a1 2003-11-23 devnull a1 = zero+1;
193 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
194 bc7cb1a1 2003-11-23 devnull a1--;
195 bc7cb1a1 2003-11-23 devnull }
196 bc7cb1a1 2003-11-23 devnull addr1 = a1;
197 bc7cb1a1 2003-11-23 devnull if(c == ';')
198 bc7cb1a1 2003-11-23 devnull dot = a1;
199 bc7cb1a1 2003-11-23 devnull }
200 bc7cb1a1 2003-11-23 devnull if(lastsep != '\n' && a1 == 0)
201 bc7cb1a1 2003-11-23 devnull a1 = dol;
202 bc7cb1a1 2003-11-23 devnull if((addr2=a1) == 0) {
203 bc7cb1a1 2003-11-23 devnull given = 0;
204 bc7cb1a1 2003-11-23 devnull addr2 = dot;
205 bc7cb1a1 2003-11-23 devnull } else
206 bc7cb1a1 2003-11-23 devnull given = 1;
207 bc7cb1a1 2003-11-23 devnull if(addr1 == 0)
208 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
209 bc7cb1a1 2003-11-23 devnull switch(c) {
210 bc7cb1a1 2003-11-23 devnull
211 bc7cb1a1 2003-11-23 devnull case 'a':
212 bc7cb1a1 2003-11-23 devnull add(0);
213 bc7cb1a1 2003-11-23 devnull continue;
214 bc7cb1a1 2003-11-23 devnull
215 bc7cb1a1 2003-11-23 devnull case 'b':
216 bc7cb1a1 2003-11-23 devnull nonzero();
217 bc7cb1a1 2003-11-23 devnull browse();
218 bc7cb1a1 2003-11-23 devnull continue;
219 bc7cb1a1 2003-11-23 devnull
220 bc7cb1a1 2003-11-23 devnull case 'c':
221 bc7cb1a1 2003-11-23 devnull nonzero();
222 bc7cb1a1 2003-11-23 devnull newline();
223 bc7cb1a1 2003-11-23 devnull rdelete(addr1, addr2);
224 bc7cb1a1 2003-11-23 devnull append(gettty, addr1-1);
225 bc7cb1a1 2003-11-23 devnull continue;
226 bc7cb1a1 2003-11-23 devnull
227 bc7cb1a1 2003-11-23 devnull case 'd':
228 bc7cb1a1 2003-11-23 devnull nonzero();
229 bc7cb1a1 2003-11-23 devnull newline();
230 bc7cb1a1 2003-11-23 devnull rdelete(addr1, addr2);
231 bc7cb1a1 2003-11-23 devnull continue;
232 bc7cb1a1 2003-11-23 devnull
233 bc7cb1a1 2003-11-23 devnull case 'E':
234 bc7cb1a1 2003-11-23 devnull fchange = 0;
235 bc7cb1a1 2003-11-23 devnull c = 'e';
236 bc7cb1a1 2003-11-23 devnull case 'e':
237 bc7cb1a1 2003-11-23 devnull setnoaddr();
238 bc7cb1a1 2003-11-23 devnull if(vflag && fchange) {
239 bc7cb1a1 2003-11-23 devnull fchange = 0;
240 bc7cb1a1 2003-11-23 devnull error(Q);
241 bc7cb1a1 2003-11-23 devnull }
242 bc7cb1a1 2003-11-23 devnull filename(c);
243 bc7cb1a1 2003-11-23 devnull init();
244 bc7cb1a1 2003-11-23 devnull addr2 = zero;
245 bc7cb1a1 2003-11-23 devnull goto caseread;
246 bc7cb1a1 2003-11-23 devnull
247 bc7cb1a1 2003-11-23 devnull case 'f':
248 bc7cb1a1 2003-11-23 devnull setnoaddr();
249 bc7cb1a1 2003-11-23 devnull filename(c);
250 bc7cb1a1 2003-11-23 devnull putst(savedfile);
251 bc7cb1a1 2003-11-23 devnull continue;
252 bc7cb1a1 2003-11-23 devnull
253 bc7cb1a1 2003-11-23 devnull case 'g':
254 bc7cb1a1 2003-11-23 devnull global(1);
255 bc7cb1a1 2003-11-23 devnull continue;
256 bc7cb1a1 2003-11-23 devnull
257 bc7cb1a1 2003-11-23 devnull case 'i':
258 bc7cb1a1 2003-11-23 devnull add(-1);
259 bc7cb1a1 2003-11-23 devnull continue;
260 bc7cb1a1 2003-11-23 devnull
261 bc7cb1a1 2003-11-23 devnull
262 bc7cb1a1 2003-11-23 devnull case 'j':
263 bc7cb1a1 2003-11-23 devnull if(!given)
264 bc7cb1a1 2003-11-23 devnull addr2++;
265 bc7cb1a1 2003-11-23 devnull newline();
266 bc7cb1a1 2003-11-23 devnull join();
267 bc7cb1a1 2003-11-23 devnull continue;
268 bc7cb1a1 2003-11-23 devnull
269 bc7cb1a1 2003-11-23 devnull case 'k':
270 bc7cb1a1 2003-11-23 devnull nonzero();
271 bc7cb1a1 2003-11-23 devnull c = getchr();
272 bc7cb1a1 2003-11-23 devnull if(c < 'a' || c > 'z')
273 bc7cb1a1 2003-11-23 devnull error(Q);
274 bc7cb1a1 2003-11-23 devnull newline();
275 bc7cb1a1 2003-11-23 devnull names[c-'a'] = *addr2 & ~01;
276 bc7cb1a1 2003-11-23 devnull anymarks |= 01;
277 bc7cb1a1 2003-11-23 devnull continue;
278 bc7cb1a1 2003-11-23 devnull
279 bc7cb1a1 2003-11-23 devnull case 'm':
280 bc7cb1a1 2003-11-23 devnull move(0);
281 bc7cb1a1 2003-11-23 devnull continue;
282 bc7cb1a1 2003-11-23 devnull
283 bc7cb1a1 2003-11-23 devnull case 'n':
284 bc7cb1a1 2003-11-23 devnull listn++;
285 bc7cb1a1 2003-11-23 devnull newline();
286 bc7cb1a1 2003-11-23 devnull printcom();
287 bc7cb1a1 2003-11-23 devnull continue;
288 bc7cb1a1 2003-11-23 devnull
289 bc7cb1a1 2003-11-23 devnull case '\n':
290 bc7cb1a1 2003-11-23 devnull if(a1==0) {
291 bc7cb1a1 2003-11-23 devnull a1 = dot+1;
292 bc7cb1a1 2003-11-23 devnull addr2 = a1;
293 bc7cb1a1 2003-11-23 devnull addr1 = a1;
294 bc7cb1a1 2003-11-23 devnull }
295 bc7cb1a1 2003-11-23 devnull if(lastsep==';')
296 bc7cb1a1 2003-11-23 devnull addr1 = a1;
297 bc7cb1a1 2003-11-23 devnull printcom();
298 bc7cb1a1 2003-11-23 devnull continue;
299 bc7cb1a1 2003-11-23 devnull
300 bc7cb1a1 2003-11-23 devnull case 'l':
301 bc7cb1a1 2003-11-23 devnull listf++;
302 bc7cb1a1 2003-11-23 devnull case 'p':
303 bc7cb1a1 2003-11-23 devnull case 'P':
304 bc7cb1a1 2003-11-23 devnull newline();
305 bc7cb1a1 2003-11-23 devnull printcom();
306 bc7cb1a1 2003-11-23 devnull continue;
307 bc7cb1a1 2003-11-23 devnull
308 bc7cb1a1 2003-11-23 devnull case 'Q':
309 bc7cb1a1 2003-11-23 devnull fchange = 0;
310 bc7cb1a1 2003-11-23 devnull case 'q':
311 bc7cb1a1 2003-11-23 devnull setnoaddr();
312 bc7cb1a1 2003-11-23 devnull newline();
313 bc7cb1a1 2003-11-23 devnull quit();
314 bc7cb1a1 2003-11-23 devnull
315 bc7cb1a1 2003-11-23 devnull case 'r':
316 bc7cb1a1 2003-11-23 devnull filename(c);
317 bc7cb1a1 2003-11-23 devnull caseread:
318 bc7cb1a1 2003-11-23 devnull if((io=open(file, OREAD)) < 0) {
319 bc7cb1a1 2003-11-23 devnull lastc = '\n';
320 bc7cb1a1 2003-11-23 devnull error(file);
321 bc7cb1a1 2003-11-23 devnull }
322 bc7cb1a1 2003-11-23 devnull if((d = dirfstat(io)) != nil){
323 bc7cb1a1 2003-11-23 devnull if(d->mode & DMAPPEND)
324 bc7cb1a1 2003-11-23 devnull print("warning: %s is append only\n", file);
325 bc7cb1a1 2003-11-23 devnull free(d);
326 bc7cb1a1 2003-11-23 devnull }
327 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OREAD);
328 bc7cb1a1 2003-11-23 devnull setwide();
329 bc7cb1a1 2003-11-23 devnull squeeze(0);
330 bc7cb1a1 2003-11-23 devnull c = zero != dol;
331 bc7cb1a1 2003-11-23 devnull append(getfile, addr2);
332 bc7cb1a1 2003-11-23 devnull exfile(OREAD);
333 bc7cb1a1 2003-11-23 devnull
334 bc7cb1a1 2003-11-23 devnull fchange = c;
335 bc7cb1a1 2003-11-23 devnull continue;
336 bc7cb1a1 2003-11-23 devnull
337 bc7cb1a1 2003-11-23 devnull case 's':
338 bc7cb1a1 2003-11-23 devnull nonzero();
339 bc7cb1a1 2003-11-23 devnull substitute(globp != 0);
340 bc7cb1a1 2003-11-23 devnull continue;
341 bc7cb1a1 2003-11-23 devnull
342 bc7cb1a1 2003-11-23 devnull case 't':
343 bc7cb1a1 2003-11-23 devnull move(1);
344 bc7cb1a1 2003-11-23 devnull continue;
345 bc7cb1a1 2003-11-23 devnull
346 bc7cb1a1 2003-11-23 devnull case 'u':
347 bc7cb1a1 2003-11-23 devnull nonzero();
348 bc7cb1a1 2003-11-23 devnull newline();
349 bc7cb1a1 2003-11-23 devnull if((*addr2&~01) != subnewa)
350 bc7cb1a1 2003-11-23 devnull error(Q);
351 bc7cb1a1 2003-11-23 devnull *addr2 = subolda;
352 bc7cb1a1 2003-11-23 devnull dot = addr2;
353 bc7cb1a1 2003-11-23 devnull continue;
354 bc7cb1a1 2003-11-23 devnull
355 bc7cb1a1 2003-11-23 devnull case 'v':
356 bc7cb1a1 2003-11-23 devnull global(0);
357 bc7cb1a1 2003-11-23 devnull continue;
358 bc7cb1a1 2003-11-23 devnull
359 bc7cb1a1 2003-11-23 devnull case 'W':
360 bc7cb1a1 2003-11-23 devnull wrapp++;
361 bc7cb1a1 2003-11-23 devnull case 'w':
362 bc7cb1a1 2003-11-23 devnull setwide();
363 bc7cb1a1 2003-11-23 devnull squeeze(dol>zero);
364 bc7cb1a1 2003-11-23 devnull temp = getchr();
365 bc7cb1a1 2003-11-23 devnull if(temp != 'q' && temp != 'Q') {
366 bc7cb1a1 2003-11-23 devnull peekc = temp;
367 bc7cb1a1 2003-11-23 devnull temp = 0;
368 bc7cb1a1 2003-11-23 devnull }
369 bc7cb1a1 2003-11-23 devnull filename(c);
370 bc7cb1a1 2003-11-23 devnull if(!wrapp ||
371 bc7cb1a1 2003-11-23 devnull ((io = open(file, OWRITE)) == -1) ||
372 bc7cb1a1 2003-11-23 devnull ((seek(io, 0L, 2)) == -1))
373 bc7cb1a1 2003-11-23 devnull if((io = create(file, OWRITE, 0666)) < 0)
374 bc7cb1a1 2003-11-23 devnull error(file);
375 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OWRITE);
376 bc7cb1a1 2003-11-23 devnull wrapp = 0;
377 bc7cb1a1 2003-11-23 devnull if(dol > zero)
378 bc7cb1a1 2003-11-23 devnull putfile();
379 bc7cb1a1 2003-11-23 devnull exfile(OWRITE);
380 bc7cb1a1 2003-11-23 devnull if(addr1<=zero+1 && addr2==dol)
381 bc7cb1a1 2003-11-23 devnull fchange = 0;
382 bc7cb1a1 2003-11-23 devnull if(temp == 'Q')
383 bc7cb1a1 2003-11-23 devnull fchange = 0;
384 bc7cb1a1 2003-11-23 devnull if(temp)
385 bc7cb1a1 2003-11-23 devnull quit();
386 bc7cb1a1 2003-11-23 devnull continue;
387 bc7cb1a1 2003-11-23 devnull
388 bc7cb1a1 2003-11-23 devnull case '=':
389 bc7cb1a1 2003-11-23 devnull setwide();
390 bc7cb1a1 2003-11-23 devnull squeeze(0);
391 bc7cb1a1 2003-11-23 devnull newline();
392 bc7cb1a1 2003-11-23 devnull count = addr2 - zero;
393 bc7cb1a1 2003-11-23 devnull putd();
394 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
395 bc7cb1a1 2003-11-23 devnull continue;
396 bc7cb1a1 2003-11-23 devnull
397 bc7cb1a1 2003-11-23 devnull case '!':
398 bc7cb1a1 2003-11-23 devnull callunix();
399 bc7cb1a1 2003-11-23 devnull continue;
400 bc7cb1a1 2003-11-23 devnull
401 bc7cb1a1 2003-11-23 devnull case EOF:
402 bc7cb1a1 2003-11-23 devnull return;
403 bc7cb1a1 2003-11-23 devnull
404 bc7cb1a1 2003-11-23 devnull }
405 bc7cb1a1 2003-11-23 devnull error(Q);
406 bc7cb1a1 2003-11-23 devnull }
407 bc7cb1a1 2003-11-23 devnull }
408 bc7cb1a1 2003-11-23 devnull
409 bc7cb1a1 2003-11-23 devnull void
410 bc7cb1a1 2003-11-23 devnull printcom(void)
411 bc7cb1a1 2003-11-23 devnull {
412 bc7cb1a1 2003-11-23 devnull int *a1;
413 bc7cb1a1 2003-11-23 devnull
414 bc7cb1a1 2003-11-23 devnull nonzero();
415 bc7cb1a1 2003-11-23 devnull a1 = addr1;
416 bc7cb1a1 2003-11-23 devnull do {
417 bc7cb1a1 2003-11-23 devnull if(listn) {
418 bc7cb1a1 2003-11-23 devnull count = a1-zero;
419 bc7cb1a1 2003-11-23 devnull putd();
420 bc7cb1a1 2003-11-23 devnull putchr(L'\t');
421 bc7cb1a1 2003-11-23 devnull }
422 bc7cb1a1 2003-11-23 devnull putshst(getline(*a1++));
423 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
424 bc7cb1a1 2003-11-23 devnull dot = addr2;
425 bc7cb1a1 2003-11-23 devnull listf = 0;
426 bc7cb1a1 2003-11-23 devnull listn = 0;
427 bc7cb1a1 2003-11-23 devnull pflag = 0;
428 bc7cb1a1 2003-11-23 devnull }
429 bc7cb1a1 2003-11-23 devnull
430 bc7cb1a1 2003-11-23 devnull int*
431 bc7cb1a1 2003-11-23 devnull address(void)
432 bc7cb1a1 2003-11-23 devnull {
433 bc7cb1a1 2003-11-23 devnull int sign, *a, opcnt, nextopand, *b, c;
434 bc7cb1a1 2003-11-23 devnull
435 bc7cb1a1 2003-11-23 devnull nextopand = -1;
436 bc7cb1a1 2003-11-23 devnull sign = 1;
437 bc7cb1a1 2003-11-23 devnull opcnt = 0;
438 bc7cb1a1 2003-11-23 devnull a = dot;
439 bc7cb1a1 2003-11-23 devnull do {
440 bc7cb1a1 2003-11-23 devnull do {
441 bc7cb1a1 2003-11-23 devnull c = getchr();
442 bc7cb1a1 2003-11-23 devnull } while(c == ' ' || c == '\t');
443 bc7cb1a1 2003-11-23 devnull if(c >= '0' && c <= '9') {
444 bc7cb1a1 2003-11-23 devnull peekc = c;
445 bc7cb1a1 2003-11-23 devnull if(!opcnt)
446 bc7cb1a1 2003-11-23 devnull a = zero;
447 bc7cb1a1 2003-11-23 devnull a += sign*getnum();
448 bc7cb1a1 2003-11-23 devnull } else
449 bc7cb1a1 2003-11-23 devnull switch(c) {
450 bc7cb1a1 2003-11-23 devnull case '$':
451 bc7cb1a1 2003-11-23 devnull a = dol;
452 bc7cb1a1 2003-11-23 devnull case '.':
453 bc7cb1a1 2003-11-23 devnull if(opcnt)
454 bc7cb1a1 2003-11-23 devnull error(Q);
455 bc7cb1a1 2003-11-23 devnull break;
456 bc7cb1a1 2003-11-23 devnull case '\'':
457 bc7cb1a1 2003-11-23 devnull c = getchr();
458 bc7cb1a1 2003-11-23 devnull if(opcnt || c < 'a' || c > 'z')
459 bc7cb1a1 2003-11-23 devnull error(Q);
460 bc7cb1a1 2003-11-23 devnull a = zero;
461 bc7cb1a1 2003-11-23 devnull do {
462 bc7cb1a1 2003-11-23 devnull a++;
463 bc7cb1a1 2003-11-23 devnull } while(a <= dol && names[c-'a'] != (*a & ~01));
464 bc7cb1a1 2003-11-23 devnull break;
465 bc7cb1a1 2003-11-23 devnull case '?':
466 bc7cb1a1 2003-11-23 devnull sign = -sign;
467 bc7cb1a1 2003-11-23 devnull case '/':
468 bc7cb1a1 2003-11-23 devnull compile(c);
469 bc7cb1a1 2003-11-23 devnull b = a;
470 bc7cb1a1 2003-11-23 devnull for(;;) {
471 bc7cb1a1 2003-11-23 devnull a += sign;
472 bc7cb1a1 2003-11-23 devnull if(a <= zero)
473 bc7cb1a1 2003-11-23 devnull a = dol;
474 bc7cb1a1 2003-11-23 devnull if(a > dol)
475 bc7cb1a1 2003-11-23 devnull a = zero;
476 bc7cb1a1 2003-11-23 devnull if(match(a))
477 bc7cb1a1 2003-11-23 devnull break;
478 bc7cb1a1 2003-11-23 devnull if(a == b)
479 bc7cb1a1 2003-11-23 devnull error(Q);
480 bc7cb1a1 2003-11-23 devnull }
481 bc7cb1a1 2003-11-23 devnull break;
482 bc7cb1a1 2003-11-23 devnull default:
483 bc7cb1a1 2003-11-23 devnull if(nextopand == opcnt) {
484 bc7cb1a1 2003-11-23 devnull a += sign;
485 bc7cb1a1 2003-11-23 devnull if(a < zero || dol < a)
486 bc7cb1a1 2003-11-23 devnull continue; /* error(Q); */
487 bc7cb1a1 2003-11-23 devnull }
488 bc7cb1a1 2003-11-23 devnull if(c != '+' && c != '-' && c != '^') {
489 bc7cb1a1 2003-11-23 devnull peekc = c;
490 bc7cb1a1 2003-11-23 devnull if(opcnt == 0)
491 bc7cb1a1 2003-11-23 devnull a = 0;
492 bc7cb1a1 2003-11-23 devnull return a;
493 bc7cb1a1 2003-11-23 devnull }
494 bc7cb1a1 2003-11-23 devnull sign = 1;
495 bc7cb1a1 2003-11-23 devnull if(c != '+')
496 bc7cb1a1 2003-11-23 devnull sign = -sign;
497 bc7cb1a1 2003-11-23 devnull nextopand = ++opcnt;
498 bc7cb1a1 2003-11-23 devnull continue;
499 bc7cb1a1 2003-11-23 devnull }
500 bc7cb1a1 2003-11-23 devnull sign = 1;
501 bc7cb1a1 2003-11-23 devnull opcnt++;
502 bc7cb1a1 2003-11-23 devnull } while(zero <= a && a <= dol);
503 bc7cb1a1 2003-11-23 devnull error(Q);
504 bc7cb1a1 2003-11-23 devnull return 0;
505 bc7cb1a1 2003-11-23 devnull }
506 bc7cb1a1 2003-11-23 devnull
507 bc7cb1a1 2003-11-23 devnull int
508 bc7cb1a1 2003-11-23 devnull getnum(void)
509 bc7cb1a1 2003-11-23 devnull {
510 bc7cb1a1 2003-11-23 devnull int r, c;
511 bc7cb1a1 2003-11-23 devnull
512 bc7cb1a1 2003-11-23 devnull r = 0;
513 bc7cb1a1 2003-11-23 devnull for(;;) {
514 bc7cb1a1 2003-11-23 devnull c = getchr();
515 bc7cb1a1 2003-11-23 devnull if(c < '0' || c > '9')
516 bc7cb1a1 2003-11-23 devnull break;
517 bc7cb1a1 2003-11-23 devnull r = r*10 + (c-'0');
518 bc7cb1a1 2003-11-23 devnull }
519 bc7cb1a1 2003-11-23 devnull peekc = c;
520 bc7cb1a1 2003-11-23 devnull return r;
521 bc7cb1a1 2003-11-23 devnull }
522 bc7cb1a1 2003-11-23 devnull
523 bc7cb1a1 2003-11-23 devnull void
524 bc7cb1a1 2003-11-23 devnull setwide(void)
525 bc7cb1a1 2003-11-23 devnull {
526 bc7cb1a1 2003-11-23 devnull if(!given) {
527 bc7cb1a1 2003-11-23 devnull addr1 = zero + (dol>zero);
528 bc7cb1a1 2003-11-23 devnull addr2 = dol;
529 bc7cb1a1 2003-11-23 devnull }
530 bc7cb1a1 2003-11-23 devnull }
531 bc7cb1a1 2003-11-23 devnull
532 bc7cb1a1 2003-11-23 devnull void
533 bc7cb1a1 2003-11-23 devnull setnoaddr(void)
534 bc7cb1a1 2003-11-23 devnull {
535 bc7cb1a1 2003-11-23 devnull if(given)
536 bc7cb1a1 2003-11-23 devnull error(Q);
537 bc7cb1a1 2003-11-23 devnull }
538 bc7cb1a1 2003-11-23 devnull
539 bc7cb1a1 2003-11-23 devnull void
540 bc7cb1a1 2003-11-23 devnull nonzero(void)
541 bc7cb1a1 2003-11-23 devnull {
542 bc7cb1a1 2003-11-23 devnull squeeze(1);
543 bc7cb1a1 2003-11-23 devnull }
544 bc7cb1a1 2003-11-23 devnull
545 bc7cb1a1 2003-11-23 devnull void
546 bc7cb1a1 2003-11-23 devnull squeeze(int i)
547 bc7cb1a1 2003-11-23 devnull {
548 bc7cb1a1 2003-11-23 devnull if(addr1 < zero+i || addr2 > dol || addr1 > addr2)
549 bc7cb1a1 2003-11-23 devnull error(Q);
550 bc7cb1a1 2003-11-23 devnull }
551 bc7cb1a1 2003-11-23 devnull
552 bc7cb1a1 2003-11-23 devnull void
553 bc7cb1a1 2003-11-23 devnull newline(void)
554 bc7cb1a1 2003-11-23 devnull {
555 bc7cb1a1 2003-11-23 devnull int c;
556 bc7cb1a1 2003-11-23 devnull
557 bc7cb1a1 2003-11-23 devnull c = getchr();
558 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF)
559 bc7cb1a1 2003-11-23 devnull return;
560 bc7cb1a1 2003-11-23 devnull if(c == 'p' || c == 'l' || c == 'n') {
561 bc7cb1a1 2003-11-23 devnull pflag++;
562 bc7cb1a1 2003-11-23 devnull if(c == 'l')
563 bc7cb1a1 2003-11-23 devnull listf++;
564 bc7cb1a1 2003-11-23 devnull else
565 bc7cb1a1 2003-11-23 devnull if(c == 'n')
566 bc7cb1a1 2003-11-23 devnull listn++;
567 bc7cb1a1 2003-11-23 devnull c = getchr();
568 bc7cb1a1 2003-11-23 devnull if(c == '\n')
569 bc7cb1a1 2003-11-23 devnull return;
570 bc7cb1a1 2003-11-23 devnull }
571 bc7cb1a1 2003-11-23 devnull error(Q);
572 bc7cb1a1 2003-11-23 devnull }
573 bc7cb1a1 2003-11-23 devnull
574 bc7cb1a1 2003-11-23 devnull void
575 bc7cb1a1 2003-11-23 devnull filename(int comm)
576 bc7cb1a1 2003-11-23 devnull {
577 bc7cb1a1 2003-11-23 devnull char *p1, *p2;
578 bc7cb1a1 2003-11-23 devnull Rune rune;
579 bc7cb1a1 2003-11-23 devnull int c;
580 bc7cb1a1 2003-11-23 devnull
581 bc7cb1a1 2003-11-23 devnull count = 0;
582 bc7cb1a1 2003-11-23 devnull c = getchr();
583 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF) {
584 bc7cb1a1 2003-11-23 devnull p1 = savedfile;
585 bc7cb1a1 2003-11-23 devnull if(*p1 == 0 && comm != 'f')
586 bc7cb1a1 2003-11-23 devnull error(Q);
587 bc7cb1a1 2003-11-23 devnull p2 = file;
588 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
589 bc7cb1a1 2003-11-23 devnull ;
590 bc7cb1a1 2003-11-23 devnull return;
591 bc7cb1a1 2003-11-23 devnull }
592 bc7cb1a1 2003-11-23 devnull if(c != ' ')
593 bc7cb1a1 2003-11-23 devnull error(Q);
594 bc7cb1a1 2003-11-23 devnull while((c=getchr()) == ' ')
595 bc7cb1a1 2003-11-23 devnull ;
596 bc7cb1a1 2003-11-23 devnull if(c == '\n')
597 bc7cb1a1 2003-11-23 devnull error(Q);
598 bc7cb1a1 2003-11-23 devnull p1 = file;
599 bc7cb1a1 2003-11-23 devnull do {
600 bc7cb1a1 2003-11-23 devnull if(p1 >= &file[sizeof(file)-6] || c == ' ' || c == EOF)
601 bc7cb1a1 2003-11-23 devnull error(Q);
602 bc7cb1a1 2003-11-23 devnull rune = c;
603 bc7cb1a1 2003-11-23 devnull p1 += runetochar(p1, &rune);
604 bc7cb1a1 2003-11-23 devnull } while((c=getchr()) != '\n');
605 bc7cb1a1 2003-11-23 devnull *p1 = 0;
606 bc7cb1a1 2003-11-23 devnull if(savedfile[0] == 0 || comm == 'e' || comm == 'f') {
607 bc7cb1a1 2003-11-23 devnull p1 = savedfile;
608 bc7cb1a1 2003-11-23 devnull p2 = file;
609 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
610 bc7cb1a1 2003-11-23 devnull ;
611 bc7cb1a1 2003-11-23 devnull }
612 bc7cb1a1 2003-11-23 devnull }
613 bc7cb1a1 2003-11-23 devnull
614 bc7cb1a1 2003-11-23 devnull void
615 bc7cb1a1 2003-11-23 devnull exfile(int om)
616 bc7cb1a1 2003-11-23 devnull {
617 bc7cb1a1 2003-11-23 devnull
618 bc7cb1a1 2003-11-23 devnull if(om == OWRITE)
619 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
620 bc7cb1a1 2003-11-23 devnull error(Q);
621 bc7cb1a1 2003-11-23 devnull close(io);
622 bc7cb1a1 2003-11-23 devnull io = -1;
623 bc7cb1a1 2003-11-23 devnull if(vflag) {
624 bc7cb1a1 2003-11-23 devnull putd();
625 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
626 bc7cb1a1 2003-11-23 devnull }
627 bc7cb1a1 2003-11-23 devnull }
628 bc7cb1a1 2003-11-23 devnull
629 bc7cb1a1 2003-11-23 devnull void
630 bc7cb1a1 2003-11-23 devnull error1(char *s)
631 bc7cb1a1 2003-11-23 devnull {
632 bc7cb1a1 2003-11-23 devnull int c;
633 bc7cb1a1 2003-11-23 devnull
634 bc7cb1a1 2003-11-23 devnull wrapp = 0;
635 bc7cb1a1 2003-11-23 devnull listf = 0;
636 bc7cb1a1 2003-11-23 devnull listn = 0;
637 bc7cb1a1 2003-11-23 devnull count = 0;
638 bc7cb1a1 2003-11-23 devnull seek(0, 0, 2);
639 bc7cb1a1 2003-11-23 devnull pflag = 0;
640 bc7cb1a1 2003-11-23 devnull if(globp)
641 bc7cb1a1 2003-11-23 devnull lastc = '\n';
642 bc7cb1a1 2003-11-23 devnull globp = 0;
643 bc7cb1a1 2003-11-23 devnull peekc = lastc;
644 bc7cb1a1 2003-11-23 devnull if(lastc)
645 bc7cb1a1 2003-11-23 devnull for(;;) {
646 bc7cb1a1 2003-11-23 devnull c = getchr();
647 bc7cb1a1 2003-11-23 devnull if(c == '\n' || c == EOF)
648 bc7cb1a1 2003-11-23 devnull break;
649 bc7cb1a1 2003-11-23 devnull }
650 bc7cb1a1 2003-11-23 devnull if(io > 0) {
651 bc7cb1a1 2003-11-23 devnull close(io);
652 bc7cb1a1 2003-11-23 devnull io = -1;
653 bc7cb1a1 2003-11-23 devnull }
654 bc7cb1a1 2003-11-23 devnull putchr(L'?');
655 bc7cb1a1 2003-11-23 devnull putst(s);
656 bc7cb1a1 2003-11-23 devnull }
657 bc7cb1a1 2003-11-23 devnull
658 bc7cb1a1 2003-11-23 devnull void
659 bc7cb1a1 2003-11-23 devnull error(char *s)
660 bc7cb1a1 2003-11-23 devnull {
661 bc7cb1a1 2003-11-23 devnull error1(s);
662 bc7cb1a1 2003-11-23 devnull longjmp(savej, 1);
663 bc7cb1a1 2003-11-23 devnull }
664 bc7cb1a1 2003-11-23 devnull
665 bc7cb1a1 2003-11-23 devnull void
666 bc7cb1a1 2003-11-23 devnull rescue(void)
667 bc7cb1a1 2003-11-23 devnull {
668 bc7cb1a1 2003-11-23 devnull rescuing = 1;
669 bc7cb1a1 2003-11-23 devnull if(dol > zero) {
670 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
671 bc7cb1a1 2003-11-23 devnull addr2 = dol;
672 bc7cb1a1 2003-11-23 devnull io = create("ed.hup", OWRITE, 0666);
673 bc7cb1a1 2003-11-23 devnull if(io > 0){
674 bc7cb1a1 2003-11-23 devnull Binit(&iobuf, io, OWRITE);
675 bc7cb1a1 2003-11-23 devnull putfile();
676 bc7cb1a1 2003-11-23 devnull }
677 bc7cb1a1 2003-11-23 devnull }
678 bc7cb1a1 2003-11-23 devnull fchange = 0;
679 bc7cb1a1 2003-11-23 devnull quit();
680 bc7cb1a1 2003-11-23 devnull }
681 bc7cb1a1 2003-11-23 devnull
682 bc7cb1a1 2003-11-23 devnull void
683 bc7cb1a1 2003-11-23 devnull notifyf(void *a, char *s)
684 bc7cb1a1 2003-11-23 devnull {
685 bc7cb1a1 2003-11-23 devnull if(strcmp(s, "interrupt") == 0){
686 bc7cb1a1 2003-11-23 devnull if(rescuing || waiting)
687 bc7cb1a1 2003-11-23 devnull noted(NCONT);
688 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
689 bc7cb1a1 2003-11-23 devnull lastc = '\n';
690 bc7cb1a1 2003-11-23 devnull error1(Q);
691 bc7cb1a1 2003-11-23 devnull notejmp(a, savej, 0);
692 bc7cb1a1 2003-11-23 devnull }
693 bc7cb1a1 2003-11-23 devnull if(strcmp(s, "hangup") == 0){
694 bc7cb1a1 2003-11-23 devnull if(rescuing)
695 bc7cb1a1 2003-11-23 devnull noted(NDFLT);
696 bc7cb1a1 2003-11-23 devnull rescue();
697 bc7cb1a1 2003-11-23 devnull }
698 bc7cb1a1 2003-11-23 devnull fprint(2, "ed: note: %s\n", s);
699 bc7cb1a1 2003-11-23 devnull abort();
700 bc7cb1a1 2003-11-23 devnull }
701 bc7cb1a1 2003-11-23 devnull
702 bc7cb1a1 2003-11-23 devnull int
703 bc7cb1a1 2003-11-23 devnull getchr(void)
704 bc7cb1a1 2003-11-23 devnull {
705 bc7cb1a1 2003-11-23 devnull char s[UTFmax];
706 bc7cb1a1 2003-11-23 devnull int i;
707 bc7cb1a1 2003-11-23 devnull Rune r;
708 bc7cb1a1 2003-11-23 devnull
709 bc7cb1a1 2003-11-23 devnull if(lastc = peekc) {
710 bc7cb1a1 2003-11-23 devnull peekc = 0;
711 bc7cb1a1 2003-11-23 devnull return lastc;
712 bc7cb1a1 2003-11-23 devnull }
713 bc7cb1a1 2003-11-23 devnull if(globp) {
714 bc7cb1a1 2003-11-23 devnull if((lastc=*globp++) != 0)
715 bc7cb1a1 2003-11-23 devnull return lastc;
716 bc7cb1a1 2003-11-23 devnull globp = 0;
717 bc7cb1a1 2003-11-23 devnull return EOF;
718 bc7cb1a1 2003-11-23 devnull }
719 bc7cb1a1 2003-11-23 devnull for(i=0;;) {
720 bc7cb1a1 2003-11-23 devnull if(read(0, s+i, 1) <= 0)
721 bc7cb1a1 2003-11-23 devnull return lastc = EOF;
722 bc7cb1a1 2003-11-23 devnull i++;
723 bc7cb1a1 2003-11-23 devnull if(fullrune(s, i))
724 bc7cb1a1 2003-11-23 devnull break;
725 bc7cb1a1 2003-11-23 devnull
726 bc7cb1a1 2003-11-23 devnull }
727 bc7cb1a1 2003-11-23 devnull chartorune(&r, s);
728 bc7cb1a1 2003-11-23 devnull lastc = r;
729 bc7cb1a1 2003-11-23 devnull return lastc;
730 bc7cb1a1 2003-11-23 devnull }
731 bc7cb1a1 2003-11-23 devnull
732 bc7cb1a1 2003-11-23 devnull int
733 bc7cb1a1 2003-11-23 devnull gety(void)
734 bc7cb1a1 2003-11-23 devnull {
735 bc7cb1a1 2003-11-23 devnull int c;
736 bc7cb1a1 2003-11-23 devnull Rune *gf, *p;
737 bc7cb1a1 2003-11-23 devnull
738 bc7cb1a1 2003-11-23 devnull p = linebuf;
739 bc7cb1a1 2003-11-23 devnull gf = globp;
740 bc7cb1a1 2003-11-23 devnull for(;;) {
741 bc7cb1a1 2003-11-23 devnull c = getchr();
742 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
743 bc7cb1a1 2003-11-23 devnull *p = 0;
744 bc7cb1a1 2003-11-23 devnull return 0;
745 bc7cb1a1 2003-11-23 devnull }
746 bc7cb1a1 2003-11-23 devnull if(c == EOF) {
747 bc7cb1a1 2003-11-23 devnull if(gf)
748 bc7cb1a1 2003-11-23 devnull peekc = c;
749 bc7cb1a1 2003-11-23 devnull return c;
750 bc7cb1a1 2003-11-23 devnull }
751 bc7cb1a1 2003-11-23 devnull if(c == 0)
752 bc7cb1a1 2003-11-23 devnull continue;
753 bc7cb1a1 2003-11-23 devnull *p++ = c;
754 bc7cb1a1 2003-11-23 devnull if(p >= &linebuf[LBSIZE-2])
755 bc7cb1a1 2003-11-23 devnull error(Q);
756 bc7cb1a1 2003-11-23 devnull }
757 bc7cb1a1 2003-11-23 devnull return 0;
758 bc7cb1a1 2003-11-23 devnull }
759 bc7cb1a1 2003-11-23 devnull
760 bc7cb1a1 2003-11-23 devnull int
761 bc7cb1a1 2003-11-23 devnull gettty(void)
762 bc7cb1a1 2003-11-23 devnull {
763 bc7cb1a1 2003-11-23 devnull int rc;
764 bc7cb1a1 2003-11-23 devnull
765 bc7cb1a1 2003-11-23 devnull rc = gety();
766 bc7cb1a1 2003-11-23 devnull if(rc)
767 bc7cb1a1 2003-11-23 devnull return rc;
768 bc7cb1a1 2003-11-23 devnull if(linebuf[0] == '.' && linebuf[1] == 0)
769 bc7cb1a1 2003-11-23 devnull return EOF;
770 bc7cb1a1 2003-11-23 devnull return 0;
771 bc7cb1a1 2003-11-23 devnull }
772 bc7cb1a1 2003-11-23 devnull
773 bc7cb1a1 2003-11-23 devnull int
774 bc7cb1a1 2003-11-23 devnull getfile(void)
775 bc7cb1a1 2003-11-23 devnull {
776 bc7cb1a1 2003-11-23 devnull int c;
777 bc7cb1a1 2003-11-23 devnull Rune *lp;
778 bc7cb1a1 2003-11-23 devnull
779 bc7cb1a1 2003-11-23 devnull lp = linebuf;
780 bc7cb1a1 2003-11-23 devnull do {
781 bc7cb1a1 2003-11-23 devnull c = Bgetrune(&iobuf);
782 bc7cb1a1 2003-11-23 devnull if(c < 0) {
783 bc7cb1a1 2003-11-23 devnull if(lp > linebuf) {
784 bc7cb1a1 2003-11-23 devnull putst("'\\n' appended");
785 bc7cb1a1 2003-11-23 devnull c = '\n';
786 bc7cb1a1 2003-11-23 devnull } else
787 bc7cb1a1 2003-11-23 devnull return EOF;
788 bc7cb1a1 2003-11-23 devnull }
789 bc7cb1a1 2003-11-23 devnull if(lp >= &linebuf[LBSIZE]) {
790 bc7cb1a1 2003-11-23 devnull lastc = '\n';
791 bc7cb1a1 2003-11-23 devnull error(Q);
792 bc7cb1a1 2003-11-23 devnull }
793 bc7cb1a1 2003-11-23 devnull *lp++ = c;
794 bc7cb1a1 2003-11-23 devnull count++;
795 bc7cb1a1 2003-11-23 devnull } while(c != '\n');
796 bc7cb1a1 2003-11-23 devnull lp[-1] = 0;
797 bc7cb1a1 2003-11-23 devnull return 0;
798 bc7cb1a1 2003-11-23 devnull }
799 bc7cb1a1 2003-11-23 devnull
800 bc7cb1a1 2003-11-23 devnull void
801 bc7cb1a1 2003-11-23 devnull putfile(void)
802 bc7cb1a1 2003-11-23 devnull {
803 bc7cb1a1 2003-11-23 devnull int *a1;
804 bc7cb1a1 2003-11-23 devnull Rune *lp;
805 bc7cb1a1 2003-11-23 devnull long c;
806 bc7cb1a1 2003-11-23 devnull
807 bc7cb1a1 2003-11-23 devnull a1 = addr1;
808 bc7cb1a1 2003-11-23 devnull do {
809 bc7cb1a1 2003-11-23 devnull lp = getline(*a1++);
810 bc7cb1a1 2003-11-23 devnull for(;;) {
811 bc7cb1a1 2003-11-23 devnull count++;
812 bc7cb1a1 2003-11-23 devnull c = *lp++;
813 bc7cb1a1 2003-11-23 devnull if(c == 0) {
814 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, '\n') < 0)
815 bc7cb1a1 2003-11-23 devnull error(Q);
816 bc7cb1a1 2003-11-23 devnull break;
817 bc7cb1a1 2003-11-23 devnull }
818 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, c) < 0)
819 bc7cb1a1 2003-11-23 devnull error(Q);
820 bc7cb1a1 2003-11-23 devnull }
821 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
822 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
823 bc7cb1a1 2003-11-23 devnull error(Q);
824 bc7cb1a1 2003-11-23 devnull }
825 bc7cb1a1 2003-11-23 devnull
826 bc7cb1a1 2003-11-23 devnull int
827 bc7cb1a1 2003-11-23 devnull append(int (*f)(void), int *a)
828 bc7cb1a1 2003-11-23 devnull {
829 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *rdot, nline, tl;
830 bc7cb1a1 2003-11-23 devnull
831 bc7cb1a1 2003-11-23 devnull nline = 0;
832 bc7cb1a1 2003-11-23 devnull dot = a;
833 bc7cb1a1 2003-11-23 devnull while((*f)() == 0) {
834 bc7cb1a1 2003-11-23 devnull if((dol-zero) >= nlall) {
835 bc7cb1a1 2003-11-23 devnull nlall += 512;
836 bc7cb1a1 2003-11-23 devnull a1 = realloc(zero, (nlall+5)*sizeof(int*));
837 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
838 bc7cb1a1 2003-11-23 devnull error("MEM?");
839 bc7cb1a1 2003-11-23 devnull rescue();
840 bc7cb1a1 2003-11-23 devnull }
841 bc7cb1a1 2003-11-23 devnull tl = a1 - zero; /* relocate pointers */
842 bc7cb1a1 2003-11-23 devnull zero += tl;
843 bc7cb1a1 2003-11-23 devnull addr1 += tl;
844 bc7cb1a1 2003-11-23 devnull addr2 += tl;
845 bc7cb1a1 2003-11-23 devnull dol += tl;
846 bc7cb1a1 2003-11-23 devnull dot += tl;
847 bc7cb1a1 2003-11-23 devnull }
848 bc7cb1a1 2003-11-23 devnull tl = putline();
849 bc7cb1a1 2003-11-23 devnull nline++;
850 bc7cb1a1 2003-11-23 devnull a1 = ++dol;
851 bc7cb1a1 2003-11-23 devnull a2 = a1+1;
852 bc7cb1a1 2003-11-23 devnull rdot = ++dot;
853 bc7cb1a1 2003-11-23 devnull while(a1 > rdot)
854 bc7cb1a1 2003-11-23 devnull *--a2 = *--a1;
855 bc7cb1a1 2003-11-23 devnull *rdot = tl;
856 bc7cb1a1 2003-11-23 devnull }
857 bc7cb1a1 2003-11-23 devnull return nline;
858 bc7cb1a1 2003-11-23 devnull }
859 bc7cb1a1 2003-11-23 devnull
860 bc7cb1a1 2003-11-23 devnull void
861 bc7cb1a1 2003-11-23 devnull add(int i)
862 bc7cb1a1 2003-11-23 devnull {
863 bc7cb1a1 2003-11-23 devnull if(i && (given || dol > zero)) {
864 bc7cb1a1 2003-11-23 devnull addr1--;
865 bc7cb1a1 2003-11-23 devnull addr2--;
866 bc7cb1a1 2003-11-23 devnull }
867 bc7cb1a1 2003-11-23 devnull squeeze(0);
868 bc7cb1a1 2003-11-23 devnull newline();
869 bc7cb1a1 2003-11-23 devnull append(gettty, addr2);
870 bc7cb1a1 2003-11-23 devnull }
871 bc7cb1a1 2003-11-23 devnull
872 bc7cb1a1 2003-11-23 devnull void
873 bc7cb1a1 2003-11-23 devnull browse(void)
874 bc7cb1a1 2003-11-23 devnull {
875 bc7cb1a1 2003-11-23 devnull int forward, n;
876 bc7cb1a1 2003-11-23 devnull static int bformat, bnum; /* 0 */
877 bc7cb1a1 2003-11-23 devnull
878 bc7cb1a1 2003-11-23 devnull forward = 1;
879 bc7cb1a1 2003-11-23 devnull peekc = getchr();
880 bc7cb1a1 2003-11-23 devnull if(peekc != '\n'){
881 bc7cb1a1 2003-11-23 devnull if(peekc == '-' || peekc == '+') {
882 bc7cb1a1 2003-11-23 devnull if(peekc == '-')
883 bc7cb1a1 2003-11-23 devnull forward = 0;
884 bc7cb1a1 2003-11-23 devnull getchr();
885 bc7cb1a1 2003-11-23 devnull }
886 bc7cb1a1 2003-11-23 devnull n = getnum();
887 bc7cb1a1 2003-11-23 devnull if(n > 0)
888 bc7cb1a1 2003-11-23 devnull bpagesize = n;
889 bc7cb1a1 2003-11-23 devnull }
890 bc7cb1a1 2003-11-23 devnull newline();
891 bc7cb1a1 2003-11-23 devnull if(pflag) {
892 bc7cb1a1 2003-11-23 devnull bformat = listf;
893 bc7cb1a1 2003-11-23 devnull bnum = listn;
894 bc7cb1a1 2003-11-23 devnull } else {
895 bc7cb1a1 2003-11-23 devnull listf = bformat;
896 bc7cb1a1 2003-11-23 devnull listn = bnum;
897 bc7cb1a1 2003-11-23 devnull }
898 bc7cb1a1 2003-11-23 devnull if(forward) {
899 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
900 bc7cb1a1 2003-11-23 devnull addr2 += bpagesize;
901 bc7cb1a1 2003-11-23 devnull if(addr2 > dol)
902 bc7cb1a1 2003-11-23 devnull addr2 = dol;
903 bc7cb1a1 2003-11-23 devnull } else {
904 bc7cb1a1 2003-11-23 devnull addr1 = addr2-bpagesize;
905 bc7cb1a1 2003-11-23 devnull if(addr1 <= zero)
906 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
907 bc7cb1a1 2003-11-23 devnull }
908 bc7cb1a1 2003-11-23 devnull printcom();
909 bc7cb1a1 2003-11-23 devnull }
910 bc7cb1a1 2003-11-23 devnull
911 bc7cb1a1 2003-11-23 devnull void
912 bc7cb1a1 2003-11-23 devnull callunix(void)
913 bc7cb1a1 2003-11-23 devnull {
914 bc7cb1a1 2003-11-23 devnull int c, pid;
915 bc7cb1a1 2003-11-23 devnull Rune rune;
916 bc7cb1a1 2003-11-23 devnull char buf[512];
917 bc7cb1a1 2003-11-23 devnull char *p;
918 bc7cb1a1 2003-11-23 devnull
919 bc7cb1a1 2003-11-23 devnull setnoaddr();
920 bc7cb1a1 2003-11-23 devnull p = buf;
921 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != EOF && c != '\n')
922 bc7cb1a1 2003-11-23 devnull if(p < &buf[sizeof(buf) - 6]) {
923 bc7cb1a1 2003-11-23 devnull rune = c;
924 bc7cb1a1 2003-11-23 devnull p += runetochar(p, &rune);
925 bc7cb1a1 2003-11-23 devnull }
926 bc7cb1a1 2003-11-23 devnull *p = 0;
927 bc7cb1a1 2003-11-23 devnull pid = fork();
928 bc7cb1a1 2003-11-23 devnull if(pid == 0) {
929 bc7cb1a1 2003-11-23 devnull execl("/bin/rc", "rc", "-c", buf, 0);
930 bc7cb1a1 2003-11-23 devnull exits("execl failed");
931 bc7cb1a1 2003-11-23 devnull }
932 bc7cb1a1 2003-11-23 devnull waiting = 1;
933 bc7cb1a1 2003-11-23 devnull while(waitpid() != pid)
934 bc7cb1a1 2003-11-23 devnull ;
935 bc7cb1a1 2003-11-23 devnull waiting = 0;
936 bc7cb1a1 2003-11-23 devnull if(vflag)
937 bc7cb1a1 2003-11-23 devnull putst("!");
938 bc7cb1a1 2003-11-23 devnull }
939 bc7cb1a1 2003-11-23 devnull
940 bc7cb1a1 2003-11-23 devnull void
941 bc7cb1a1 2003-11-23 devnull quit(void)
942 bc7cb1a1 2003-11-23 devnull {
943 bc7cb1a1 2003-11-23 devnull if(vflag && fchange && dol!=zero) {
944 bc7cb1a1 2003-11-23 devnull fchange = 0;
945 bc7cb1a1 2003-11-23 devnull error(Q);
946 bc7cb1a1 2003-11-23 devnull }
947 bc7cb1a1 2003-11-23 devnull remove(tfname);
948 bc7cb1a1 2003-11-23 devnull exits(0);
949 bc7cb1a1 2003-11-23 devnull }
950 bc7cb1a1 2003-11-23 devnull
951 bc7cb1a1 2003-11-23 devnull void
952 bc7cb1a1 2003-11-23 devnull onquit(int sig)
953 bc7cb1a1 2003-11-23 devnull {
954 bc7cb1a1 2003-11-23 devnull USED(sig);
955 bc7cb1a1 2003-11-23 devnull quit();
956 bc7cb1a1 2003-11-23 devnull }
957 bc7cb1a1 2003-11-23 devnull
958 bc7cb1a1 2003-11-23 devnull void
959 bc7cb1a1 2003-11-23 devnull rdelete(int *ad1, int *ad2)
960 bc7cb1a1 2003-11-23 devnull {
961 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
962 bc7cb1a1 2003-11-23 devnull
963 bc7cb1a1 2003-11-23 devnull a1 = ad1;
964 bc7cb1a1 2003-11-23 devnull a2 = ad2+1;
965 bc7cb1a1 2003-11-23 devnull a3 = dol;
966 bc7cb1a1 2003-11-23 devnull dol -= a2 - a1;
967 bc7cb1a1 2003-11-23 devnull do {
968 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
969 bc7cb1a1 2003-11-23 devnull } while(a2 <= a3);
970 bc7cb1a1 2003-11-23 devnull a1 = ad1;
971 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
972 bc7cb1a1 2003-11-23 devnull a1 = dol;
973 bc7cb1a1 2003-11-23 devnull dot = a1;
974 bc7cb1a1 2003-11-23 devnull fchange = 1;
975 bc7cb1a1 2003-11-23 devnull }
976 bc7cb1a1 2003-11-23 devnull
977 bc7cb1a1 2003-11-23 devnull void
978 bc7cb1a1 2003-11-23 devnull gdelete(void)
979 bc7cb1a1 2003-11-23 devnull {
980 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
981 bc7cb1a1 2003-11-23 devnull
982 bc7cb1a1 2003-11-23 devnull a3 = dol;
983 bc7cb1a1 2003-11-23 devnull for(a1=zero; (*a1&01)==0; a1++)
984 bc7cb1a1 2003-11-23 devnull if(a1>=a3)
985 bc7cb1a1 2003-11-23 devnull return;
986 bc7cb1a1 2003-11-23 devnull for(a2=a1+1; a2<=a3;) {
987 bc7cb1a1 2003-11-23 devnull if(*a2 & 01) {
988 bc7cb1a1 2003-11-23 devnull a2++;
989 bc7cb1a1 2003-11-23 devnull dot = a1;
990 bc7cb1a1 2003-11-23 devnull } else
991 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
992 bc7cb1a1 2003-11-23 devnull }
993 bc7cb1a1 2003-11-23 devnull dol = a1-1;
994 bc7cb1a1 2003-11-23 devnull if(dot > dol)
995 bc7cb1a1 2003-11-23 devnull dot = dol;
996 bc7cb1a1 2003-11-23 devnull fchange = 1;
997 bc7cb1a1 2003-11-23 devnull }
998 bc7cb1a1 2003-11-23 devnull
999 bc7cb1a1 2003-11-23 devnull Rune*
1000 bc7cb1a1 2003-11-23 devnull getline(int tl)
1001 bc7cb1a1 2003-11-23 devnull {
1002 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1003 bc7cb1a1 2003-11-23 devnull int nl;
1004 bc7cb1a1 2003-11-23 devnull
1005 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1006 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OREAD);
1007 bc7cb1a1 2003-11-23 devnull nl = nleft;
1008 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2) - 1);
1009 bc7cb1a1 2003-11-23 devnull while(*lp++ = *bp++) {
1010 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1011 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1012 bc7cb1a1 2003-11-23 devnull bp = getblock(tl += BLKSIZE/2, OREAD);
1013 bc7cb1a1 2003-11-23 devnull nl = nleft;
1014 bc7cb1a1 2003-11-23 devnull }
1015 bc7cb1a1 2003-11-23 devnull }
1016 bc7cb1a1 2003-11-23 devnull return linebuf;
1017 bc7cb1a1 2003-11-23 devnull }
1018 bc7cb1a1 2003-11-23 devnull
1019 bc7cb1a1 2003-11-23 devnull int
1020 bc7cb1a1 2003-11-23 devnull putline(void)
1021 bc7cb1a1 2003-11-23 devnull {
1022 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1023 bc7cb1a1 2003-11-23 devnull int nl, tl;
1024 bc7cb1a1 2003-11-23 devnull
1025 bc7cb1a1 2003-11-23 devnull fchange = 1;
1026 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1027 bc7cb1a1 2003-11-23 devnull tl = tline;
1028 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1029 bc7cb1a1 2003-11-23 devnull nl = nleft;
1030 bc7cb1a1 2003-11-23 devnull tl &= ~((BLKSIZE/2)-1);
1031 bc7cb1a1 2003-11-23 devnull while(*bp = *lp++) {
1032 bc7cb1a1 2003-11-23 devnull if(*bp++ == '\n') {
1033 bc7cb1a1 2003-11-23 devnull bp[-1] = 0;
1034 bc7cb1a1 2003-11-23 devnull linebp = lp;
1035 bc7cb1a1 2003-11-23 devnull break;
1036 bc7cb1a1 2003-11-23 devnull }
1037 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1038 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1039 bc7cb1a1 2003-11-23 devnull tl += BLKSIZE/2;
1040 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1041 bc7cb1a1 2003-11-23 devnull nl = nleft;
1042 bc7cb1a1 2003-11-23 devnull }
1043 bc7cb1a1 2003-11-23 devnull }
1044 bc7cb1a1 2003-11-23 devnull nl = tline;
1045 bc7cb1a1 2003-11-23 devnull tline += ((lp-linebuf) + 03) & 077776;
1046 bc7cb1a1 2003-11-23 devnull return nl;
1047 bc7cb1a1 2003-11-23 devnull }
1048 bc7cb1a1 2003-11-23 devnull
1049 bc7cb1a1 2003-11-23 devnull void
1050 bc7cb1a1 2003-11-23 devnull blkio(int b, uchar *buf, int isread)
1051 bc7cb1a1 2003-11-23 devnull {
1052 bc7cb1a1 2003-11-23 devnull int n;
1053 bc7cb1a1 2003-11-23 devnull
1054 bc7cb1a1 2003-11-23 devnull seek(tfile, b*BLKSIZE, 0);
1055 bc7cb1a1 2003-11-23 devnull if(isread)
1056 bc7cb1a1 2003-11-23 devnull n = read(tfile, buf, BLKSIZE);
1057 bc7cb1a1 2003-11-23 devnull else
1058 bc7cb1a1 2003-11-23 devnull n = write(tfile, buf, BLKSIZE);
1059 bc7cb1a1 2003-11-23 devnull if(n != BLKSIZE)
1060 bc7cb1a1 2003-11-23 devnull error(T);
1061 bc7cb1a1 2003-11-23 devnull }
1062 bc7cb1a1 2003-11-23 devnull
1063 bc7cb1a1 2003-11-23 devnull Rune*
1064 bc7cb1a1 2003-11-23 devnull getblock(int atl, int iof)
1065 bc7cb1a1 2003-11-23 devnull {
1066 bc7cb1a1 2003-11-23 devnull int bno, off;
1067 bc7cb1a1 2003-11-23 devnull
1068 bc7cb1a1 2003-11-23 devnull static uchar ibuff[BLKSIZE];
1069 bc7cb1a1 2003-11-23 devnull static uchar obuff[BLKSIZE];
1070 bc7cb1a1 2003-11-23 devnull
1071 bc7cb1a1 2003-11-23 devnull bno = atl / (BLKSIZE/2);
1072 bc7cb1a1 2003-11-23 devnull off = (atl<<1) & (BLKSIZE-1) & ~03;
1073 bc7cb1a1 2003-11-23 devnull if(bno >= NBLK) {
1074 bc7cb1a1 2003-11-23 devnull lastc = '\n';
1075 bc7cb1a1 2003-11-23 devnull error(T);
1076 bc7cb1a1 2003-11-23 devnull }
1077 bc7cb1a1 2003-11-23 devnull nleft = BLKSIZE - off;
1078 bc7cb1a1 2003-11-23 devnull if(bno == iblock) {
1079 bc7cb1a1 2003-11-23 devnull ichanged |= iof;
1080 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1081 bc7cb1a1 2003-11-23 devnull }
1082 bc7cb1a1 2003-11-23 devnull if(bno == oblock)
1083 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1084 bc7cb1a1 2003-11-23 devnull if(iof == OREAD) {
1085 bc7cb1a1 2003-11-23 devnull if(ichanged)
1086 bc7cb1a1 2003-11-23 devnull blkio(iblock, ibuff, 0);
1087 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1088 bc7cb1a1 2003-11-23 devnull iblock = bno;
1089 bc7cb1a1 2003-11-23 devnull blkio(bno, ibuff, 1);
1090 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1091 bc7cb1a1 2003-11-23 devnull }
1092 bc7cb1a1 2003-11-23 devnull if(oblock >= 0)
1093 bc7cb1a1 2003-11-23 devnull blkio(oblock, obuff, 0);
1094 bc7cb1a1 2003-11-23 devnull oblock = bno;
1095 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1096 bc7cb1a1 2003-11-23 devnull }
1097 bc7cb1a1 2003-11-23 devnull
1098 bc7cb1a1 2003-11-23 devnull void
1099 bc7cb1a1 2003-11-23 devnull init(void)
1100 bc7cb1a1 2003-11-23 devnull {
1101 bc7cb1a1 2003-11-23 devnull int *markp;
1102 bc7cb1a1 2003-11-23 devnull
1103 bc7cb1a1 2003-11-23 devnull close(tfile);
1104 bc7cb1a1 2003-11-23 devnull tline = 2;
1105 bc7cb1a1 2003-11-23 devnull for(markp = names; markp < &names[26]; )
1106 bc7cb1a1 2003-11-23 devnull *markp++ = 0;
1107 bc7cb1a1 2003-11-23 devnull subnewa = 0;
1108 bc7cb1a1 2003-11-23 devnull anymarks = 0;
1109 bc7cb1a1 2003-11-23 devnull iblock = -1;
1110 bc7cb1a1 2003-11-23 devnull oblock = -1;
1111 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1112 bc7cb1a1 2003-11-23 devnull if((tfile = create(tfname, ORDWR, 0600)) < 0){
1113 bc7cb1a1 2003-11-23 devnull error1(T);
1114 bc7cb1a1 2003-11-23 devnull exits(0);
1115 bc7cb1a1 2003-11-23 devnull }
1116 bc7cb1a1 2003-11-23 devnull dot = dol = zero;
1117 bc7cb1a1 2003-11-23 devnull }
1118 bc7cb1a1 2003-11-23 devnull
1119 bc7cb1a1 2003-11-23 devnull void
1120 bc7cb1a1 2003-11-23 devnull global(int k)
1121 bc7cb1a1 2003-11-23 devnull {
1122 bc7cb1a1 2003-11-23 devnull Rune *gp, globuf[GBSIZE];
1123 bc7cb1a1 2003-11-23 devnull int c, *a1;
1124 bc7cb1a1 2003-11-23 devnull
1125 bc7cb1a1 2003-11-23 devnull if(globp)
1126 bc7cb1a1 2003-11-23 devnull error(Q);
1127 bc7cb1a1 2003-11-23 devnull setwide();
1128 bc7cb1a1 2003-11-23 devnull squeeze(dol > zero);
1129 bc7cb1a1 2003-11-23 devnull c = getchr();
1130 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1131 bc7cb1a1 2003-11-23 devnull error(Q);
1132 bc7cb1a1 2003-11-23 devnull compile(c);
1133 bc7cb1a1 2003-11-23 devnull gp = globuf;
1134 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != '\n') {
1135 bc7cb1a1 2003-11-23 devnull if(c == EOF)
1136 bc7cb1a1 2003-11-23 devnull error(Q);
1137 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1138 bc7cb1a1 2003-11-23 devnull c = getchr();
1139 bc7cb1a1 2003-11-23 devnull if(c != '\n')
1140 bc7cb1a1 2003-11-23 devnull *gp++ = '\\';
1141 bc7cb1a1 2003-11-23 devnull }
1142 bc7cb1a1 2003-11-23 devnull *gp++ = c;
1143 bc7cb1a1 2003-11-23 devnull if(gp >= &globuf[GBSIZE-2])
1144 bc7cb1a1 2003-11-23 devnull error(Q);
1145 bc7cb1a1 2003-11-23 devnull }
1146 bc7cb1a1 2003-11-23 devnull if(gp == globuf)
1147 bc7cb1a1 2003-11-23 devnull *gp++ = 'p';
1148 bc7cb1a1 2003-11-23 devnull *gp++ = '\n';
1149 bc7cb1a1 2003-11-23 devnull *gp = 0;
1150 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1151 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1152 bc7cb1a1 2003-11-23 devnull if(a1 >= addr1 && a1 <= addr2 && match(a1) == k)
1153 bc7cb1a1 2003-11-23 devnull *a1 |= 01;
1154 bc7cb1a1 2003-11-23 devnull }
1155 bc7cb1a1 2003-11-23 devnull
1156 bc7cb1a1 2003-11-23 devnull /*
1157 bc7cb1a1 2003-11-23 devnull * Special case: g/.../d (avoid n^2 algorithm)
1158 bc7cb1a1 2003-11-23 devnull */
1159 bc7cb1a1 2003-11-23 devnull if(globuf[0] == 'd' && globuf[1] == '\n' && globuf[2] == 0) {
1160 bc7cb1a1 2003-11-23 devnull gdelete();
1161 bc7cb1a1 2003-11-23 devnull return;
1162 bc7cb1a1 2003-11-23 devnull }
1163 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1164 bc7cb1a1 2003-11-23 devnull if(*a1 & 01) {
1165 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1166 bc7cb1a1 2003-11-23 devnull dot = a1;
1167 bc7cb1a1 2003-11-23 devnull globp = globuf;
1168 bc7cb1a1 2003-11-23 devnull commands();
1169 bc7cb1a1 2003-11-23 devnull a1 = zero;
1170 bc7cb1a1 2003-11-23 devnull }
1171 bc7cb1a1 2003-11-23 devnull }
1172 bc7cb1a1 2003-11-23 devnull }
1173 bc7cb1a1 2003-11-23 devnull
1174 bc7cb1a1 2003-11-23 devnull void
1175 bc7cb1a1 2003-11-23 devnull join(void)
1176 bc7cb1a1 2003-11-23 devnull {
1177 bc7cb1a1 2003-11-23 devnull Rune *gp, *lp;
1178 bc7cb1a1 2003-11-23 devnull int *a1;
1179 bc7cb1a1 2003-11-23 devnull
1180 bc7cb1a1 2003-11-23 devnull nonzero();
1181 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1182 bc7cb1a1 2003-11-23 devnull for(a1=addr1; a1<=addr2; a1++) {
1183 bc7cb1a1 2003-11-23 devnull lp = getline(*a1);
1184 bc7cb1a1 2003-11-23 devnull while(*gp = *lp++)
1185 bc7cb1a1 2003-11-23 devnull if(gp++ >= &genbuf[LBSIZE-2])
1186 bc7cb1a1 2003-11-23 devnull error(Q);
1187 bc7cb1a1 2003-11-23 devnull }
1188 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1189 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1190 bc7cb1a1 2003-11-23 devnull while(*lp++ = *gp++)
1191 bc7cb1a1 2003-11-23 devnull ;
1192 bc7cb1a1 2003-11-23 devnull *addr1 = putline();
1193 bc7cb1a1 2003-11-23 devnull if(addr1 < addr2)
1194 bc7cb1a1 2003-11-23 devnull rdelete(addr1+1, addr2);
1195 bc7cb1a1 2003-11-23 devnull dot = addr1;
1196 bc7cb1a1 2003-11-23 devnull }
1197 bc7cb1a1 2003-11-23 devnull
1198 bc7cb1a1 2003-11-23 devnull void
1199 bc7cb1a1 2003-11-23 devnull substitute(int inglob)
1200 bc7cb1a1 2003-11-23 devnull {
1201 bc7cb1a1 2003-11-23 devnull int *mp, *a1, nl, gsubf, n;
1202 bc7cb1a1 2003-11-23 devnull
1203 bc7cb1a1 2003-11-23 devnull n = getnum(); /* OK even if n==0 */
1204 bc7cb1a1 2003-11-23 devnull gsubf = compsub();
1205 bc7cb1a1 2003-11-23 devnull for(a1 = addr1; a1 <= addr2; a1++) {
1206 bc7cb1a1 2003-11-23 devnull if(match(a1)){
1207 bc7cb1a1 2003-11-23 devnull int *ozero;
1208 bc7cb1a1 2003-11-23 devnull int m = n;
1209 bc7cb1a1 2003-11-23 devnull
1210 bc7cb1a1 2003-11-23 devnull do {
1211 bc7cb1a1 2003-11-23 devnull int span = loc2-loc1;
1212 bc7cb1a1 2003-11-23 devnull
1213 bc7cb1a1 2003-11-23 devnull if(--m <= 0) {
1214 bc7cb1a1 2003-11-23 devnull dosub();
1215 bc7cb1a1 2003-11-23 devnull if(!gsubf)
1216 bc7cb1a1 2003-11-23 devnull break;
1217 bc7cb1a1 2003-11-23 devnull if(span == 0) { /* null RE match */
1218 bc7cb1a1 2003-11-23 devnull if(*loc2 == 0)
1219 bc7cb1a1 2003-11-23 devnull break;
1220 bc7cb1a1 2003-11-23 devnull loc2++;
1221 bc7cb1a1 2003-11-23 devnull }
1222 bc7cb1a1 2003-11-23 devnull }
1223 bc7cb1a1 2003-11-23 devnull } while(match(0));
1224 bc7cb1a1 2003-11-23 devnull if(m <= 0) {
1225 bc7cb1a1 2003-11-23 devnull inglob |= 01;
1226 bc7cb1a1 2003-11-23 devnull subnewa = putline();
1227 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1228 bc7cb1a1 2003-11-23 devnull if(anymarks) {
1229 bc7cb1a1 2003-11-23 devnull for(mp=names; mp<&names[26]; mp++)
1230 bc7cb1a1 2003-11-23 devnull if(*mp == *a1)
1231 bc7cb1a1 2003-11-23 devnull *mp = subnewa;
1232 bc7cb1a1 2003-11-23 devnull }
1233 bc7cb1a1 2003-11-23 devnull subolda = *a1;
1234 bc7cb1a1 2003-11-23 devnull *a1 = subnewa;
1235 bc7cb1a1 2003-11-23 devnull ozero = zero;
1236 bc7cb1a1 2003-11-23 devnull nl = append(getsub, a1);
1237 bc7cb1a1 2003-11-23 devnull addr2 += nl;
1238 bc7cb1a1 2003-11-23 devnull nl += zero-ozero;
1239 bc7cb1a1 2003-11-23 devnull a1 += nl;
1240 bc7cb1a1 2003-11-23 devnull }
1241 bc7cb1a1 2003-11-23 devnull }
1242 bc7cb1a1 2003-11-23 devnull }
1243 bc7cb1a1 2003-11-23 devnull if(inglob == 0)
1244 bc7cb1a1 2003-11-23 devnull error(Q);
1245 bc7cb1a1 2003-11-23 devnull }
1246 bc7cb1a1 2003-11-23 devnull
1247 bc7cb1a1 2003-11-23 devnull int
1248 bc7cb1a1 2003-11-23 devnull compsub(void)
1249 bc7cb1a1 2003-11-23 devnull {
1250 bc7cb1a1 2003-11-23 devnull int seof, c;
1251 bc7cb1a1 2003-11-23 devnull Rune *p;
1252 bc7cb1a1 2003-11-23 devnull
1253 bc7cb1a1 2003-11-23 devnull seof = getchr();
1254 bc7cb1a1 2003-11-23 devnull if(seof == '\n' || seof == ' ')
1255 bc7cb1a1 2003-11-23 devnull error(Q);
1256 bc7cb1a1 2003-11-23 devnull compile(seof);
1257 bc7cb1a1 2003-11-23 devnull p = rhsbuf;
1258 bc7cb1a1 2003-11-23 devnull for(;;) {
1259 bc7cb1a1 2003-11-23 devnull c = getchr();
1260 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1261 bc7cb1a1 2003-11-23 devnull c = getchr();
1262 bc7cb1a1 2003-11-23 devnull *p++ = ESCFLG;
1263 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1264 bc7cb1a1 2003-11-23 devnull error(Q);
1265 bc7cb1a1 2003-11-23 devnull } else
1266 bc7cb1a1 2003-11-23 devnull if(c == '\n' && (!globp || !globp[0])) {
1267 bc7cb1a1 2003-11-23 devnull peekc = c;
1268 bc7cb1a1 2003-11-23 devnull pflag++;
1269 bc7cb1a1 2003-11-23 devnull break;
1270 bc7cb1a1 2003-11-23 devnull } else
1271 bc7cb1a1 2003-11-23 devnull if(c == seof)
1272 bc7cb1a1 2003-11-23 devnull break;
1273 bc7cb1a1 2003-11-23 devnull *p++ = c;
1274 bc7cb1a1 2003-11-23 devnull if(p >= &rhsbuf[LBSIZE/2])
1275 bc7cb1a1 2003-11-23 devnull error(Q);
1276 bc7cb1a1 2003-11-23 devnull }
1277 bc7cb1a1 2003-11-23 devnull *p = 0;
1278 bc7cb1a1 2003-11-23 devnull peekc = getchr();
1279 bc7cb1a1 2003-11-23 devnull if(peekc == 'g') {
1280 bc7cb1a1 2003-11-23 devnull peekc = 0;
1281 bc7cb1a1 2003-11-23 devnull newline();
1282 bc7cb1a1 2003-11-23 devnull return 1;
1283 bc7cb1a1 2003-11-23 devnull }
1284 bc7cb1a1 2003-11-23 devnull newline();
1285 bc7cb1a1 2003-11-23 devnull return 0;
1286 bc7cb1a1 2003-11-23 devnull }
1287 bc7cb1a1 2003-11-23 devnull
1288 bc7cb1a1 2003-11-23 devnull int
1289 bc7cb1a1 2003-11-23 devnull getsub(void)
1290 bc7cb1a1 2003-11-23 devnull {
1291 bc7cb1a1 2003-11-23 devnull Rune *p1, *p2;
1292 bc7cb1a1 2003-11-23 devnull
1293 bc7cb1a1 2003-11-23 devnull p1 = linebuf;
1294 bc7cb1a1 2003-11-23 devnull if((p2 = linebp) == 0)
1295 bc7cb1a1 2003-11-23 devnull return EOF;
1296 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
1297 bc7cb1a1 2003-11-23 devnull ;
1298 bc7cb1a1 2003-11-23 devnull linebp = 0;
1299 bc7cb1a1 2003-11-23 devnull return 0;
1300 bc7cb1a1 2003-11-23 devnull }
1301 bc7cb1a1 2003-11-23 devnull
1302 bc7cb1a1 2003-11-23 devnull void
1303 bc7cb1a1 2003-11-23 devnull dosub(void)
1304 bc7cb1a1 2003-11-23 devnull {
1305 bc7cb1a1 2003-11-23 devnull Rune *lp, *sp, *rp;
1306 bc7cb1a1 2003-11-23 devnull int c, n;
1307 bc7cb1a1 2003-11-23 devnull
1308 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1309 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1310 bc7cb1a1 2003-11-23 devnull rp = rhsbuf;
1311 bc7cb1a1 2003-11-23 devnull while(lp < loc1)
1312 bc7cb1a1 2003-11-23 devnull *sp++ = *lp++;
1313 bc7cb1a1 2003-11-23 devnull while(c = *rp++) {
1314 bc7cb1a1 2003-11-23 devnull if(c == '&'){
1315 bc7cb1a1 2003-11-23 devnull sp = place(sp, loc1, loc2);
1316 bc7cb1a1 2003-11-23 devnull continue;
1317 bc7cb1a1 2003-11-23 devnull }
1318 bc7cb1a1 2003-11-23 devnull if(c == ESCFLG && (c = *rp++) >= '1' && c < MAXSUB+'0') {
1319 bc7cb1a1 2003-11-23 devnull n = c-'0';
1320 bc7cb1a1 2003-11-23 devnull if(subexp[n].s.rsp && subexp[n].e.rep) {
1321 bc7cb1a1 2003-11-23 devnull sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep);
1322 bc7cb1a1 2003-11-23 devnull continue;
1323 bc7cb1a1 2003-11-23 devnull }
1324 bc7cb1a1 2003-11-23 devnull error(Q);
1325 bc7cb1a1 2003-11-23 devnull }
1326 bc7cb1a1 2003-11-23 devnull *sp++ = c;
1327 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1328 bc7cb1a1 2003-11-23 devnull error(Q);
1329 bc7cb1a1 2003-11-23 devnull }
1330 bc7cb1a1 2003-11-23 devnull lp = loc2;
1331 bc7cb1a1 2003-11-23 devnull loc2 = sp - genbuf + linebuf;
1332 bc7cb1a1 2003-11-23 devnull while(*sp++ = *lp++)
1333 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1334 bc7cb1a1 2003-11-23 devnull error(Q);
1335 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1336 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1337 bc7cb1a1 2003-11-23 devnull while(*lp++ = *sp++)
1338 bc7cb1a1 2003-11-23 devnull ;
1339 bc7cb1a1 2003-11-23 devnull }
1340 bc7cb1a1 2003-11-23 devnull
1341 bc7cb1a1 2003-11-23 devnull Rune*
1342 bc7cb1a1 2003-11-23 devnull place(Rune *sp, Rune *l1, Rune *l2)
1343 bc7cb1a1 2003-11-23 devnull {
1344 bc7cb1a1 2003-11-23 devnull
1345 bc7cb1a1 2003-11-23 devnull while(l1 < l2) {
1346 bc7cb1a1 2003-11-23 devnull *sp++ = *l1++;
1347 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1348 bc7cb1a1 2003-11-23 devnull error(Q);
1349 bc7cb1a1 2003-11-23 devnull }
1350 bc7cb1a1 2003-11-23 devnull return sp;
1351 bc7cb1a1 2003-11-23 devnull }
1352 bc7cb1a1 2003-11-23 devnull
1353 bc7cb1a1 2003-11-23 devnull void
1354 bc7cb1a1 2003-11-23 devnull move(int cflag)
1355 bc7cb1a1 2003-11-23 devnull {
1356 bc7cb1a1 2003-11-23 devnull int *adt, *ad1, *ad2;
1357 bc7cb1a1 2003-11-23 devnull
1358 bc7cb1a1 2003-11-23 devnull nonzero();
1359 bc7cb1a1 2003-11-23 devnull if((adt = address())==0) /* address() guarantees addr is in range */
1360 bc7cb1a1 2003-11-23 devnull error(Q);
1361 bc7cb1a1 2003-11-23 devnull newline();
1362 bc7cb1a1 2003-11-23 devnull if(cflag) {
1363 bc7cb1a1 2003-11-23 devnull int *ozero, delta;
1364 bc7cb1a1 2003-11-23 devnull ad1 = dol;
1365 bc7cb1a1 2003-11-23 devnull ozero = zero;
1366 bc7cb1a1 2003-11-23 devnull append(getcopy, ad1++);
1367 bc7cb1a1 2003-11-23 devnull ad2 = dol;
1368 bc7cb1a1 2003-11-23 devnull delta = zero - ozero;
1369 bc7cb1a1 2003-11-23 devnull ad1 += delta;
1370 bc7cb1a1 2003-11-23 devnull adt += delta;
1371 bc7cb1a1 2003-11-23 devnull } else {
1372 bc7cb1a1 2003-11-23 devnull ad2 = addr2;
1373 bc7cb1a1 2003-11-23 devnull for(ad1 = addr1; ad1 <= ad2;)
1374 bc7cb1a1 2003-11-23 devnull *ad1++ &= ~01;
1375 bc7cb1a1 2003-11-23 devnull ad1 = addr1;
1376 bc7cb1a1 2003-11-23 devnull }
1377 bc7cb1a1 2003-11-23 devnull ad2++;
1378 bc7cb1a1 2003-11-23 devnull if(adt<ad1) {
1379 bc7cb1a1 2003-11-23 devnull dot = adt + (ad2-ad1);
1380 bc7cb1a1 2003-11-23 devnull if((++adt)==ad1)
1381 bc7cb1a1 2003-11-23 devnull return;
1382 bc7cb1a1 2003-11-23 devnull reverse(adt, ad1);
1383 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1384 bc7cb1a1 2003-11-23 devnull reverse(adt, ad2);
1385 bc7cb1a1 2003-11-23 devnull } else
1386 bc7cb1a1 2003-11-23 devnull if(adt >= ad2) {
1387 bc7cb1a1 2003-11-23 devnull dot = adt++;
1388 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1389 bc7cb1a1 2003-11-23 devnull reverse(ad2, adt);
1390 bc7cb1a1 2003-11-23 devnull reverse(ad1, adt);
1391 bc7cb1a1 2003-11-23 devnull } else
1392 bc7cb1a1 2003-11-23 devnull error(Q);
1393 bc7cb1a1 2003-11-23 devnull fchange = 1;
1394 bc7cb1a1 2003-11-23 devnull }
1395 bc7cb1a1 2003-11-23 devnull
1396 bc7cb1a1 2003-11-23 devnull void
1397 bc7cb1a1 2003-11-23 devnull reverse(int *a1, int *a2)
1398 bc7cb1a1 2003-11-23 devnull {
1399 bc7cb1a1 2003-11-23 devnull int t;
1400 bc7cb1a1 2003-11-23 devnull
1401 bc7cb1a1 2003-11-23 devnull for(;;) {
1402 bc7cb1a1 2003-11-23 devnull t = *--a2;
1403 bc7cb1a1 2003-11-23 devnull if(a2 <= a1)
1404 bc7cb1a1 2003-11-23 devnull return;
1405 bc7cb1a1 2003-11-23 devnull *a2 = *a1;
1406 bc7cb1a1 2003-11-23 devnull *a1++ = t;
1407 bc7cb1a1 2003-11-23 devnull }
1408 bc7cb1a1 2003-11-23 devnull }
1409 bc7cb1a1 2003-11-23 devnull
1410 bc7cb1a1 2003-11-23 devnull int
1411 bc7cb1a1 2003-11-23 devnull getcopy(void)
1412 bc7cb1a1 2003-11-23 devnull {
1413 bc7cb1a1 2003-11-23 devnull if(addr1 > addr2)
1414 bc7cb1a1 2003-11-23 devnull return EOF;
1415 bc7cb1a1 2003-11-23 devnull getline(*addr1++);
1416 bc7cb1a1 2003-11-23 devnull return 0;
1417 bc7cb1a1 2003-11-23 devnull }
1418 bc7cb1a1 2003-11-23 devnull
1419 bc7cb1a1 2003-11-23 devnull void
1420 bc7cb1a1 2003-11-23 devnull compile(int eof)
1421 bc7cb1a1 2003-11-23 devnull {
1422 bc7cb1a1 2003-11-23 devnull Rune c;
1423 bc7cb1a1 2003-11-23 devnull char *ep;
1424 bc7cb1a1 2003-11-23 devnull char expbuf[ESIZE];
1425 bc7cb1a1 2003-11-23 devnull
1426 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1427 bc7cb1a1 2003-11-23 devnull peekc = c;
1428 bc7cb1a1 2003-11-23 devnull c = eof;
1429 bc7cb1a1 2003-11-23 devnull }
1430 bc7cb1a1 2003-11-23 devnull if(c == eof) {
1431 bc7cb1a1 2003-11-23 devnull if(!pattern)
1432 bc7cb1a1 2003-11-23 devnull error(Q);
1433 bc7cb1a1 2003-11-23 devnull return;
1434 bc7cb1a1 2003-11-23 devnull }
1435 bc7cb1a1 2003-11-23 devnull if(pattern) {
1436 bc7cb1a1 2003-11-23 devnull free(pattern);
1437 bc7cb1a1 2003-11-23 devnull pattern = 0;
1438 bc7cb1a1 2003-11-23 devnull }
1439 bc7cb1a1 2003-11-23 devnull ep = expbuf;
1440 bc7cb1a1 2003-11-23 devnull do {
1441 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1442 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1443 bc7cb1a1 2003-11-23 devnull error(Q);
1444 bc7cb1a1 2003-11-23 devnull return;
1445 bc7cb1a1 2003-11-23 devnull }
1446 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1447 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
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 }
1452 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
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 ep += runetochar(ep, &c);
1457 bc7cb1a1 2003-11-23 devnull } while((c = getchr()) != eof && c != '\n');
1458 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1459 bc7cb1a1 2003-11-23 devnull peekc = c;
1460 bc7cb1a1 2003-11-23 devnull *ep = 0;
1461 bc7cb1a1 2003-11-23 devnull pattern = regcomp(expbuf);
1462 bc7cb1a1 2003-11-23 devnull }
1463 bc7cb1a1 2003-11-23 devnull
1464 bc7cb1a1 2003-11-23 devnull int
1465 bc7cb1a1 2003-11-23 devnull match(int *addr)
1466 bc7cb1a1 2003-11-23 devnull {
1467 bc7cb1a1 2003-11-23 devnull if(!pattern)
1468 bc7cb1a1 2003-11-23 devnull return 0;
1469 bc7cb1a1 2003-11-23 devnull if(addr){
1470 bc7cb1a1 2003-11-23 devnull if(addr == zero)
1471 bc7cb1a1 2003-11-23 devnull return 0;
1472 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = getline(*addr);
1473 bc7cb1a1 2003-11-23 devnull } else
1474 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = loc2;
1475 bc7cb1a1 2003-11-23 devnull subexp[0].e.rep = 0;
1476 bc7cb1a1 2003-11-23 devnull if(rregexec(pattern, linebuf, subexp, MAXSUB)) {
1477 bc7cb1a1 2003-11-23 devnull loc1 = subexp[0].s.rsp;
1478 bc7cb1a1 2003-11-23 devnull loc2 = subexp[0].e.rep;
1479 bc7cb1a1 2003-11-23 devnull return 1;
1480 bc7cb1a1 2003-11-23 devnull }
1481 bc7cb1a1 2003-11-23 devnull loc1 = loc2 = 0;
1482 bc7cb1a1 2003-11-23 devnull return 0;
1483 bc7cb1a1 2003-11-23 devnull
1484 bc7cb1a1 2003-11-23 devnull }
1485 bc7cb1a1 2003-11-23 devnull
1486 bc7cb1a1 2003-11-23 devnull void
1487 bc7cb1a1 2003-11-23 devnull putd(void)
1488 bc7cb1a1 2003-11-23 devnull {
1489 bc7cb1a1 2003-11-23 devnull int r;
1490 bc7cb1a1 2003-11-23 devnull
1491 bc7cb1a1 2003-11-23 devnull r = count%10;
1492 bc7cb1a1 2003-11-23 devnull count /= 10;
1493 bc7cb1a1 2003-11-23 devnull if(count)
1494 bc7cb1a1 2003-11-23 devnull putd();
1495 bc7cb1a1 2003-11-23 devnull putchr(r + L'0');
1496 bc7cb1a1 2003-11-23 devnull }
1497 bc7cb1a1 2003-11-23 devnull
1498 bc7cb1a1 2003-11-23 devnull void
1499 bc7cb1a1 2003-11-23 devnull putst(char *sp)
1500 bc7cb1a1 2003-11-23 devnull {
1501 bc7cb1a1 2003-11-23 devnull Rune r;
1502 bc7cb1a1 2003-11-23 devnull
1503 bc7cb1a1 2003-11-23 devnull col = 0;
1504 bc7cb1a1 2003-11-23 devnull for(;;) {
1505 bc7cb1a1 2003-11-23 devnull sp += chartorune(&r, sp);
1506 bc7cb1a1 2003-11-23 devnull if(r == 0)
1507 bc7cb1a1 2003-11-23 devnull break;
1508 bc7cb1a1 2003-11-23 devnull putchr(r);
1509 bc7cb1a1 2003-11-23 devnull }
1510 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
1511 bc7cb1a1 2003-11-23 devnull }
1512 bc7cb1a1 2003-11-23 devnull
1513 bc7cb1a1 2003-11-23 devnull void
1514 bc7cb1a1 2003-11-23 devnull putshst(Rune *sp)
1515 bc7cb1a1 2003-11-23 devnull {
1516 bc7cb1a1 2003-11-23 devnull col = 0;
1517 bc7cb1a1 2003-11-23 devnull while(*sp)
1518 bc7cb1a1 2003-11-23 devnull putchr(*sp++);
1519 bc7cb1a1 2003-11-23 devnull putchr(L'\n');
1520 bc7cb1a1 2003-11-23 devnull }
1521 bc7cb1a1 2003-11-23 devnull
1522 bc7cb1a1 2003-11-23 devnull void
1523 bc7cb1a1 2003-11-23 devnull putchr(int ac)
1524 bc7cb1a1 2003-11-23 devnull {
1525 bc7cb1a1 2003-11-23 devnull char *lp;
1526 bc7cb1a1 2003-11-23 devnull int c;
1527 bc7cb1a1 2003-11-23 devnull Rune rune;
1528 bc7cb1a1 2003-11-23 devnull
1529 bc7cb1a1 2003-11-23 devnull lp = linp;
1530 bc7cb1a1 2003-11-23 devnull c = ac;
1531 bc7cb1a1 2003-11-23 devnull if(listf) {
1532 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
1533 bc7cb1a1 2003-11-23 devnull if(linp != line && linp[-1] == ' ') {
1534 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1535 bc7cb1a1 2003-11-23 devnull *lp++ = 'n';
1536 bc7cb1a1 2003-11-23 devnull }
1537 bc7cb1a1 2003-11-23 devnull } else {
1538 bc7cb1a1 2003-11-23 devnull if(col > (72-6-2)) {
1539 bc7cb1a1 2003-11-23 devnull col = 8;
1540 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1541 bc7cb1a1 2003-11-23 devnull *lp++ = '\n';
1542 bc7cb1a1 2003-11-23 devnull *lp++ = '\t';
1543 bc7cb1a1 2003-11-23 devnull }
1544 bc7cb1a1 2003-11-23 devnull col++;
1545 bc7cb1a1 2003-11-23 devnull if(c=='\b' || c=='\t' || c=='\\') {
1546 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1547 bc7cb1a1 2003-11-23 devnull if(c == '\b')
1548 bc7cb1a1 2003-11-23 devnull c = 'b';
1549 bc7cb1a1 2003-11-23 devnull else
1550 bc7cb1a1 2003-11-23 devnull if(c == '\t')
1551 bc7cb1a1 2003-11-23 devnull c = 't';
1552 bc7cb1a1 2003-11-23 devnull col++;
1553 bc7cb1a1 2003-11-23 devnull } else
1554 bc7cb1a1 2003-11-23 devnull if(c<' ' || c>='\177') {
1555 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1556 bc7cb1a1 2003-11-23 devnull *lp++ = 'x';
1557 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>12];
1558 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>8&0xF];
1559 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>4&0xF];
1560 bc7cb1a1 2003-11-23 devnull c = hex[c&0xF];
1561 bc7cb1a1 2003-11-23 devnull col += 5;
1562 bc7cb1a1 2003-11-23 devnull }
1563 bc7cb1a1 2003-11-23 devnull }
1564 bc7cb1a1 2003-11-23 devnull }
1565 bc7cb1a1 2003-11-23 devnull
1566 bc7cb1a1 2003-11-23 devnull rune = c;
1567 bc7cb1a1 2003-11-23 devnull lp += runetochar(lp, &rune);
1568 bc7cb1a1 2003-11-23 devnull
1569 bc7cb1a1 2003-11-23 devnull if(c == '\n' || lp >= &line[sizeof(line)-5]) {
1570 bc7cb1a1 2003-11-23 devnull linp = line;
1571 bc7cb1a1 2003-11-23 devnull write(oflag? 2: 1, line, lp-line);
1572 bc7cb1a1 2003-11-23 devnull return;
1573 bc7cb1a1 2003-11-23 devnull }
1574 bc7cb1a1 2003-11-23 devnull linp = lp;
1575 bc7cb1a1 2003-11-23 devnull }
1576 bc7cb1a1 2003-11-23 devnull
1577 bc7cb1a1 2003-11-23 devnull char*
1578 bc7cb1a1 2003-11-23 devnull mktemp(char *as)
1579 bc7cb1a1 2003-11-23 devnull {
1580 bc7cb1a1 2003-11-23 devnull char *s;
1581 bc7cb1a1 2003-11-23 devnull unsigned pid;
1582 bc7cb1a1 2003-11-23 devnull int i;
1583 bc7cb1a1 2003-11-23 devnull
1584 bc7cb1a1 2003-11-23 devnull pid = getpid();
1585 bc7cb1a1 2003-11-23 devnull s = as;
1586 bc7cb1a1 2003-11-23 devnull while(*s++)
1587 bc7cb1a1 2003-11-23 devnull ;
1588 bc7cb1a1 2003-11-23 devnull s--;
1589 bc7cb1a1 2003-11-23 devnull while(*--s == 'X') {
1590 bc7cb1a1 2003-11-23 devnull *s = pid % 10 + '0';
1591 bc7cb1a1 2003-11-23 devnull pid /= 10;
1592 bc7cb1a1 2003-11-23 devnull }
1593 bc7cb1a1 2003-11-23 devnull s++;
1594 bc7cb1a1 2003-11-23 devnull i = 'a';
1595 bc7cb1a1 2003-11-23 devnull while(access(as, 0) != -1) {
1596 bc7cb1a1 2003-11-23 devnull if(i == 'z')
1597 bc7cb1a1 2003-11-23 devnull return "/";
1598 bc7cb1a1 2003-11-23 devnull *s = i++;
1599 bc7cb1a1 2003-11-23 devnull }
1600 bc7cb1a1 2003-11-23 devnull return as;
1601 bc7cb1a1 2003-11-23 devnull }
1602 bc7cb1a1 2003-11-23 devnull
1603 bc7cb1a1 2003-11-23 devnull void
1604 bc7cb1a1 2003-11-23 devnull regerror(char *s)
1605 bc7cb1a1 2003-11-23 devnull {
1606 bc7cb1a1 2003-11-23 devnull USED(s);
1607 bc7cb1a1 2003-11-23 devnull error(Q);
1608 bc7cb1a1 2003-11-23 devnull }