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 cbeb0b26 2006-04-01 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 cfa81d56 2009-09-16 russcox Rune rhsbuf[LBSIZE/sizeof(Rune)];
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 90c3dab6 2006-07-23 devnull char tmp[] = "/var/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 c8b6342d 2005-01-13 devnull p1 = "/dev/stdout";
150 bc7cb1a1 2003-11-23 devnull p2 = savedfile;
151 bc7cb1a1 2003-11-23 devnull while(*p2++ = *p1++)
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 bb0266fe 2005-05-07 devnull putchr('\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 bb0266fe 2005-05-07 devnull putchr('\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 bb0266fe 2005-05-07 devnull putchr('\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 bb0266fe 2005-05-07 devnull putchr('?');
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 bb0266fe 2005-05-07 devnull putchr('\n');
691 bc7cb1a1 2003-11-23 devnull lastc = '\n';
692 bc7cb1a1 2003-11-23 devnull error1(Q);
693 bc7cb1a1 2003-11-23 devnull notejmp(a, savej, 0);
694 bc7cb1a1 2003-11-23 devnull }
695 90c3dab6 2006-07-23 devnull if(strcmp(s, "hangup") == 0 || strcmp(s, "kill") == 0){
696 bc7cb1a1 2003-11-23 devnull if(rescuing)
697 bc7cb1a1 2003-11-23 devnull noted(NDFLT);
698 bc7cb1a1 2003-11-23 devnull rescue();
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 }
762 bc7cb1a1 2003-11-23 devnull
763 bc7cb1a1 2003-11-23 devnull int
764 bc7cb1a1 2003-11-23 devnull gettty(void)
765 bc7cb1a1 2003-11-23 devnull {
766 bc7cb1a1 2003-11-23 devnull int rc;
767 bc7cb1a1 2003-11-23 devnull
768 bc7cb1a1 2003-11-23 devnull rc = gety();
769 bc7cb1a1 2003-11-23 devnull if(rc)
770 bc7cb1a1 2003-11-23 devnull return rc;
771 bc7cb1a1 2003-11-23 devnull if(linebuf[0] == '.' && linebuf[1] == 0)
772 bc7cb1a1 2003-11-23 devnull return EOF;
773 bc7cb1a1 2003-11-23 devnull return 0;
774 bc7cb1a1 2003-11-23 devnull }
775 bc7cb1a1 2003-11-23 devnull
776 bc7cb1a1 2003-11-23 devnull int
777 bc7cb1a1 2003-11-23 devnull getfile(void)
778 bc7cb1a1 2003-11-23 devnull {
779 bc7cb1a1 2003-11-23 devnull int c;
780 bc7cb1a1 2003-11-23 devnull Rune *lp;
781 bc7cb1a1 2003-11-23 devnull
782 bc7cb1a1 2003-11-23 devnull lp = linebuf;
783 bc7cb1a1 2003-11-23 devnull do {
784 bc7cb1a1 2003-11-23 devnull c = Bgetrune(&iobuf);
785 bc7cb1a1 2003-11-23 devnull if(c < 0) {
786 bc7cb1a1 2003-11-23 devnull if(lp > linebuf) {
787 bc7cb1a1 2003-11-23 devnull putst("'\\n' appended");
788 bc7cb1a1 2003-11-23 devnull c = '\n';
789 bc7cb1a1 2003-11-23 devnull } else
790 bc7cb1a1 2003-11-23 devnull return EOF;
791 bc7cb1a1 2003-11-23 devnull }
792 bc7cb1a1 2003-11-23 devnull if(lp >= &linebuf[LBSIZE]) {
793 bc7cb1a1 2003-11-23 devnull lastc = '\n';
794 bc7cb1a1 2003-11-23 devnull error(Q);
795 bc7cb1a1 2003-11-23 devnull }
796 bc7cb1a1 2003-11-23 devnull *lp++ = c;
797 bc7cb1a1 2003-11-23 devnull count++;
798 bc7cb1a1 2003-11-23 devnull } while(c != '\n');
799 bc7cb1a1 2003-11-23 devnull lp[-1] = 0;
800 bc7cb1a1 2003-11-23 devnull return 0;
801 bc7cb1a1 2003-11-23 devnull }
802 bc7cb1a1 2003-11-23 devnull
803 bc7cb1a1 2003-11-23 devnull void
804 bc7cb1a1 2003-11-23 devnull putfile(void)
805 bc7cb1a1 2003-11-23 devnull {
806 bc7cb1a1 2003-11-23 devnull int *a1;
807 bc7cb1a1 2003-11-23 devnull Rune *lp;
808 bc7cb1a1 2003-11-23 devnull long c;
809 bc7cb1a1 2003-11-23 devnull
810 bc7cb1a1 2003-11-23 devnull a1 = addr1;
811 bc7cb1a1 2003-11-23 devnull do {
812 bc7cb1a1 2003-11-23 devnull lp = getline(*a1++);
813 bc7cb1a1 2003-11-23 devnull for(;;) {
814 bc7cb1a1 2003-11-23 devnull count++;
815 bc7cb1a1 2003-11-23 devnull c = *lp++;
816 bc7cb1a1 2003-11-23 devnull if(c == 0) {
817 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, '\n') < 0)
818 bc7cb1a1 2003-11-23 devnull error(Q);
819 bc7cb1a1 2003-11-23 devnull break;
820 bc7cb1a1 2003-11-23 devnull }
821 bc7cb1a1 2003-11-23 devnull if(Bputrune(&iobuf, c) < 0)
822 bc7cb1a1 2003-11-23 devnull error(Q);
823 bc7cb1a1 2003-11-23 devnull }
824 bc7cb1a1 2003-11-23 devnull } while(a1 <= addr2);
825 bc7cb1a1 2003-11-23 devnull if(Bflush(&iobuf) < 0)
826 bc7cb1a1 2003-11-23 devnull error(Q);
827 bc7cb1a1 2003-11-23 devnull }
828 bc7cb1a1 2003-11-23 devnull
829 bc7cb1a1 2003-11-23 devnull int
830 bc7cb1a1 2003-11-23 devnull append(int (*f)(void), int *a)
831 bc7cb1a1 2003-11-23 devnull {
832 c51c2905 2010-01-12 rsc int *a1, *a2, *rdot, nline, d;
833 bc7cb1a1 2003-11-23 devnull
834 bc7cb1a1 2003-11-23 devnull nline = 0;
835 bc7cb1a1 2003-11-23 devnull dot = a;
836 bc7cb1a1 2003-11-23 devnull while((*f)() == 0) {
837 bc7cb1a1 2003-11-23 devnull if((dol-zero) >= nlall) {
838 bc7cb1a1 2003-11-23 devnull nlall += 512;
839 c51c2905 2010-01-12 rsc a1 = realloc(zero, (nlall+50)*sizeof(int*));
840 bc7cb1a1 2003-11-23 devnull if(a1 == 0) {
841 bc7cb1a1 2003-11-23 devnull error("MEM?");
842 bc7cb1a1 2003-11-23 devnull rescue();
843 bc7cb1a1 2003-11-23 devnull }
844 c51c2905 2010-01-12 rsc /* relocate pointers; avoid wraparound if sizeof(int) < sizeof(int*) */
845 c51c2905 2010-01-12 rsc d = addr1 - zero;
846 c51c2905 2010-01-12 rsc addr1 = a1 + d;
847 c51c2905 2010-01-12 rsc d = addr2 - zero;
848 c51c2905 2010-01-12 rsc addr2 = a1 + d;
849 c51c2905 2010-01-12 rsc d = dol - zero;
850 c51c2905 2010-01-12 rsc dol = a1 + d;
851 c51c2905 2010-01-12 rsc d = dot - zero;
852 c51c2905 2010-01-12 rsc dot = a1 + d;
853 c51c2905 2010-01-12 rsc zero = a1;
854 bc7cb1a1 2003-11-23 devnull }
855 c51c2905 2010-01-12 rsc d = putline();
856 bc7cb1a1 2003-11-23 devnull nline++;
857 bc7cb1a1 2003-11-23 devnull a1 = ++dol;
858 bc7cb1a1 2003-11-23 devnull a2 = a1+1;
859 bc7cb1a1 2003-11-23 devnull rdot = ++dot;
860 bc7cb1a1 2003-11-23 devnull while(a1 > rdot)
861 bc7cb1a1 2003-11-23 devnull *--a2 = *--a1;
862 c51c2905 2010-01-12 rsc *rdot = d;
863 bc7cb1a1 2003-11-23 devnull }
864 bc7cb1a1 2003-11-23 devnull return nline;
865 bc7cb1a1 2003-11-23 devnull }
866 bc7cb1a1 2003-11-23 devnull
867 bc7cb1a1 2003-11-23 devnull void
868 bc7cb1a1 2003-11-23 devnull add(int i)
869 bc7cb1a1 2003-11-23 devnull {
870 bc7cb1a1 2003-11-23 devnull if(i && (given || dol > zero)) {
871 bc7cb1a1 2003-11-23 devnull addr1--;
872 bc7cb1a1 2003-11-23 devnull addr2--;
873 bc7cb1a1 2003-11-23 devnull }
874 bc7cb1a1 2003-11-23 devnull squeeze(0);
875 bc7cb1a1 2003-11-23 devnull newline();
876 bc7cb1a1 2003-11-23 devnull append(gettty, addr2);
877 bc7cb1a1 2003-11-23 devnull }
878 bc7cb1a1 2003-11-23 devnull
879 bc7cb1a1 2003-11-23 devnull void
880 bc7cb1a1 2003-11-23 devnull browse(void)
881 bc7cb1a1 2003-11-23 devnull {
882 bc7cb1a1 2003-11-23 devnull int forward, n;
883 bc7cb1a1 2003-11-23 devnull static int bformat, bnum; /* 0 */
884 bc7cb1a1 2003-11-23 devnull
885 bc7cb1a1 2003-11-23 devnull forward = 1;
886 bc7cb1a1 2003-11-23 devnull peekc = getchr();
887 bc7cb1a1 2003-11-23 devnull if(peekc != '\n'){
888 bc7cb1a1 2003-11-23 devnull if(peekc == '-' || peekc == '+') {
889 bc7cb1a1 2003-11-23 devnull if(peekc == '-')
890 bc7cb1a1 2003-11-23 devnull forward = 0;
891 bc7cb1a1 2003-11-23 devnull getchr();
892 bc7cb1a1 2003-11-23 devnull }
893 bc7cb1a1 2003-11-23 devnull n = getnum();
894 bc7cb1a1 2003-11-23 devnull if(n > 0)
895 bc7cb1a1 2003-11-23 devnull bpagesize = n;
896 bc7cb1a1 2003-11-23 devnull }
897 bc7cb1a1 2003-11-23 devnull newline();
898 bc7cb1a1 2003-11-23 devnull if(pflag) {
899 bc7cb1a1 2003-11-23 devnull bformat = listf;
900 bc7cb1a1 2003-11-23 devnull bnum = listn;
901 bc7cb1a1 2003-11-23 devnull } else {
902 bc7cb1a1 2003-11-23 devnull listf = bformat;
903 bc7cb1a1 2003-11-23 devnull listn = bnum;
904 bc7cb1a1 2003-11-23 devnull }
905 bc7cb1a1 2003-11-23 devnull if(forward) {
906 bc7cb1a1 2003-11-23 devnull addr1 = addr2;
907 bc7cb1a1 2003-11-23 devnull addr2 += bpagesize;
908 bc7cb1a1 2003-11-23 devnull if(addr2 > dol)
909 bc7cb1a1 2003-11-23 devnull addr2 = dol;
910 bc7cb1a1 2003-11-23 devnull } else {
911 bc7cb1a1 2003-11-23 devnull addr1 = addr2-bpagesize;
912 bc7cb1a1 2003-11-23 devnull if(addr1 <= zero)
913 bc7cb1a1 2003-11-23 devnull addr1 = zero+1;
914 bc7cb1a1 2003-11-23 devnull }
915 bc7cb1a1 2003-11-23 devnull printcom();
916 bc7cb1a1 2003-11-23 devnull }
917 bc7cb1a1 2003-11-23 devnull
918 bc7cb1a1 2003-11-23 devnull void
919 bc7cb1a1 2003-11-23 devnull callunix(void)
920 bc7cb1a1 2003-11-23 devnull {
921 bc7cb1a1 2003-11-23 devnull int c, pid;
922 bc7cb1a1 2003-11-23 devnull Rune rune;
923 bc7cb1a1 2003-11-23 devnull char buf[512];
924 bc7cb1a1 2003-11-23 devnull char *p;
925 bc7cb1a1 2003-11-23 devnull
926 bc7cb1a1 2003-11-23 devnull setnoaddr();
927 bc7cb1a1 2003-11-23 devnull p = buf;
928 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != EOF && c != '\n')
929 bc7cb1a1 2003-11-23 devnull if(p < &buf[sizeof(buf) - 6]) {
930 bc7cb1a1 2003-11-23 devnull rune = c;
931 bc7cb1a1 2003-11-23 devnull p += runetochar(p, &rune);
932 bc7cb1a1 2003-11-23 devnull }
933 bc7cb1a1 2003-11-23 devnull *p = 0;
934 bc7cb1a1 2003-11-23 devnull pid = fork();
935 bc7cb1a1 2003-11-23 devnull if(pid == 0) {
936 a8ec4910 2005-07-13 devnull execlp("rc", "rc", "-c", buf, (char*)0);
937 a0f1e21f 2004-04-20 devnull sysfatal("exec failed: %r");
938 bc7cb1a1 2003-11-23 devnull exits("execl failed");
939 bc7cb1a1 2003-11-23 devnull }
940 bc7cb1a1 2003-11-23 devnull waiting = 1;
941 bc7cb1a1 2003-11-23 devnull while(waitpid() != pid)
942 bc7cb1a1 2003-11-23 devnull ;
943 bc7cb1a1 2003-11-23 devnull waiting = 0;
944 bc7cb1a1 2003-11-23 devnull if(vflag)
945 bc7cb1a1 2003-11-23 devnull putst("!");
946 bc7cb1a1 2003-11-23 devnull }
947 bc7cb1a1 2003-11-23 devnull
948 bc7cb1a1 2003-11-23 devnull void
949 bc7cb1a1 2003-11-23 devnull quit(void)
950 bc7cb1a1 2003-11-23 devnull {
951 bc7cb1a1 2003-11-23 devnull if(vflag && fchange && dol!=zero) {
952 bc7cb1a1 2003-11-23 devnull fchange = 0;
953 bc7cb1a1 2003-11-23 devnull error(Q);
954 bc7cb1a1 2003-11-23 devnull }
955 bc7cb1a1 2003-11-23 devnull remove(tfname);
956 bc7cb1a1 2003-11-23 devnull exits(0);
957 bc7cb1a1 2003-11-23 devnull }
958 bc7cb1a1 2003-11-23 devnull
959 bc7cb1a1 2003-11-23 devnull void
960 bc7cb1a1 2003-11-23 devnull onquit(int sig)
961 bc7cb1a1 2003-11-23 devnull {
962 bc7cb1a1 2003-11-23 devnull USED(sig);
963 bc7cb1a1 2003-11-23 devnull quit();
964 bc7cb1a1 2003-11-23 devnull }
965 bc7cb1a1 2003-11-23 devnull
966 bc7cb1a1 2003-11-23 devnull void
967 bc7cb1a1 2003-11-23 devnull rdelete(int *ad1, int *ad2)
968 bc7cb1a1 2003-11-23 devnull {
969 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
970 bc7cb1a1 2003-11-23 devnull
971 bc7cb1a1 2003-11-23 devnull a1 = ad1;
972 bc7cb1a1 2003-11-23 devnull a2 = ad2+1;
973 bc7cb1a1 2003-11-23 devnull a3 = dol;
974 bc7cb1a1 2003-11-23 devnull dol -= a2 - a1;
975 bc7cb1a1 2003-11-23 devnull do {
976 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
977 bc7cb1a1 2003-11-23 devnull } while(a2 <= a3);
978 bc7cb1a1 2003-11-23 devnull a1 = ad1;
979 bc7cb1a1 2003-11-23 devnull if(a1 > dol)
980 bc7cb1a1 2003-11-23 devnull a1 = dol;
981 bc7cb1a1 2003-11-23 devnull dot = a1;
982 bc7cb1a1 2003-11-23 devnull fchange = 1;
983 bc7cb1a1 2003-11-23 devnull }
984 bc7cb1a1 2003-11-23 devnull
985 bc7cb1a1 2003-11-23 devnull void
986 bc7cb1a1 2003-11-23 devnull gdelete(void)
987 bc7cb1a1 2003-11-23 devnull {
988 bc7cb1a1 2003-11-23 devnull int *a1, *a2, *a3;
989 bc7cb1a1 2003-11-23 devnull
990 bc7cb1a1 2003-11-23 devnull a3 = dol;
991 bc7cb1a1 2003-11-23 devnull for(a1=zero; (*a1&01)==0; a1++)
992 bc7cb1a1 2003-11-23 devnull if(a1>=a3)
993 bc7cb1a1 2003-11-23 devnull return;
994 bc7cb1a1 2003-11-23 devnull for(a2=a1+1; a2<=a3;) {
995 bc7cb1a1 2003-11-23 devnull if(*a2 & 01) {
996 bc7cb1a1 2003-11-23 devnull a2++;
997 bc7cb1a1 2003-11-23 devnull dot = a1;
998 bc7cb1a1 2003-11-23 devnull } else
999 bc7cb1a1 2003-11-23 devnull *a1++ = *a2++;
1000 bc7cb1a1 2003-11-23 devnull }
1001 bc7cb1a1 2003-11-23 devnull dol = a1-1;
1002 bc7cb1a1 2003-11-23 devnull if(dot > dol)
1003 bc7cb1a1 2003-11-23 devnull dot = dol;
1004 bc7cb1a1 2003-11-23 devnull fchange = 1;
1005 bc7cb1a1 2003-11-23 devnull }
1006 bc7cb1a1 2003-11-23 devnull
1007 bc7cb1a1 2003-11-23 devnull Rune*
1008 bc7cb1a1 2003-11-23 devnull getline(int tl)
1009 bc7cb1a1 2003-11-23 devnull {
1010 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1011 bc7cb1a1 2003-11-23 devnull int nl;
1012 bc7cb1a1 2003-11-23 devnull
1013 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1014 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OREAD);
1015 bc7cb1a1 2003-11-23 devnull nl = nleft;
1016 cfa81d56 2009-09-16 russcox tl &= ~((BLKSIZE/sizeof(Rune)) - 1);
1017 bc7cb1a1 2003-11-23 devnull while(*lp++ = *bp++) {
1018 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1019 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1020 cfa81d56 2009-09-16 russcox bp = getblock(tl += BLKSIZE/sizeof(Rune), OREAD);
1021 bc7cb1a1 2003-11-23 devnull nl = nleft;
1022 bc7cb1a1 2003-11-23 devnull }
1023 bc7cb1a1 2003-11-23 devnull }
1024 bc7cb1a1 2003-11-23 devnull return linebuf;
1025 bc7cb1a1 2003-11-23 devnull }
1026 bc7cb1a1 2003-11-23 devnull
1027 bc7cb1a1 2003-11-23 devnull int
1028 bc7cb1a1 2003-11-23 devnull putline(void)
1029 bc7cb1a1 2003-11-23 devnull {
1030 bc7cb1a1 2003-11-23 devnull Rune *lp, *bp;
1031 bc7cb1a1 2003-11-23 devnull int nl, tl;
1032 bc7cb1a1 2003-11-23 devnull
1033 bc7cb1a1 2003-11-23 devnull fchange = 1;
1034 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1035 bc7cb1a1 2003-11-23 devnull tl = tline;
1036 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1037 bc7cb1a1 2003-11-23 devnull nl = nleft;
1038 cfa81d56 2009-09-16 russcox tl &= ~((BLKSIZE/sizeof(Rune))-1);
1039 bc7cb1a1 2003-11-23 devnull while(*bp = *lp++) {
1040 bc7cb1a1 2003-11-23 devnull if(*bp++ == '\n') {
1041 bc7cb1a1 2003-11-23 devnull bp[-1] = 0;
1042 bc7cb1a1 2003-11-23 devnull linebp = lp;
1043 bc7cb1a1 2003-11-23 devnull break;
1044 bc7cb1a1 2003-11-23 devnull }
1045 bc7cb1a1 2003-11-23 devnull nl -= sizeof(Rune);
1046 bc7cb1a1 2003-11-23 devnull if(nl == 0) {
1047 cfa81d56 2009-09-16 russcox tl += BLKSIZE/sizeof(Rune);
1048 bc7cb1a1 2003-11-23 devnull bp = getblock(tl, OWRITE);
1049 bc7cb1a1 2003-11-23 devnull nl = nleft;
1050 bc7cb1a1 2003-11-23 devnull }
1051 bc7cb1a1 2003-11-23 devnull }
1052 bc7cb1a1 2003-11-23 devnull nl = tline;
1053 bc7cb1a1 2003-11-23 devnull tline += ((lp-linebuf) + 03) & 077776;
1054 bc7cb1a1 2003-11-23 devnull return nl;
1055 bc7cb1a1 2003-11-23 devnull }
1056 bc7cb1a1 2003-11-23 devnull
1057 bc7cb1a1 2003-11-23 devnull void
1058 bc7cb1a1 2003-11-23 devnull blkio(int b, uchar *buf, int isread)
1059 bc7cb1a1 2003-11-23 devnull {
1060 bc7cb1a1 2003-11-23 devnull int n;
1061 bc7cb1a1 2003-11-23 devnull
1062 bc7cb1a1 2003-11-23 devnull seek(tfile, b*BLKSIZE, 0);
1063 bc7cb1a1 2003-11-23 devnull if(isread)
1064 bc7cb1a1 2003-11-23 devnull n = read(tfile, buf, BLKSIZE);
1065 bc7cb1a1 2003-11-23 devnull else
1066 bc7cb1a1 2003-11-23 devnull n = write(tfile, buf, BLKSIZE);
1067 bc7cb1a1 2003-11-23 devnull if(n != BLKSIZE)
1068 bc7cb1a1 2003-11-23 devnull error(T);
1069 bc7cb1a1 2003-11-23 devnull }
1070 bc7cb1a1 2003-11-23 devnull
1071 bc7cb1a1 2003-11-23 devnull Rune*
1072 bc7cb1a1 2003-11-23 devnull getblock(int atl, int iof)
1073 bc7cb1a1 2003-11-23 devnull {
1074 bc7cb1a1 2003-11-23 devnull int bno, off;
1075 bc7cb1a1 2003-11-23 devnull
1076 bc7cb1a1 2003-11-23 devnull static uchar ibuff[BLKSIZE];
1077 bc7cb1a1 2003-11-23 devnull static uchar obuff[BLKSIZE];
1078 bc7cb1a1 2003-11-23 devnull
1079 cfa81d56 2009-09-16 russcox bno = atl / (BLKSIZE/sizeof(Rune));
1080 cfa81d56 2009-09-16 russcox off = (atl*sizeof(Rune)) & (BLKSIZE-1) & ~03;
1081 bc7cb1a1 2003-11-23 devnull if(bno >= NBLK) {
1082 bc7cb1a1 2003-11-23 devnull lastc = '\n';
1083 bc7cb1a1 2003-11-23 devnull error(T);
1084 bc7cb1a1 2003-11-23 devnull }
1085 bc7cb1a1 2003-11-23 devnull nleft = BLKSIZE - off;
1086 bc7cb1a1 2003-11-23 devnull if(bno == iblock) {
1087 bc7cb1a1 2003-11-23 devnull ichanged |= iof;
1088 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1089 bc7cb1a1 2003-11-23 devnull }
1090 bc7cb1a1 2003-11-23 devnull if(bno == oblock)
1091 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1092 bc7cb1a1 2003-11-23 devnull if(iof == OREAD) {
1093 bc7cb1a1 2003-11-23 devnull if(ichanged)
1094 bc7cb1a1 2003-11-23 devnull blkio(iblock, ibuff, 0);
1095 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1096 bc7cb1a1 2003-11-23 devnull iblock = bno;
1097 bc7cb1a1 2003-11-23 devnull blkio(bno, ibuff, 1);
1098 bc7cb1a1 2003-11-23 devnull return (Rune*)(ibuff+off);
1099 bc7cb1a1 2003-11-23 devnull }
1100 bc7cb1a1 2003-11-23 devnull if(oblock >= 0)
1101 bc7cb1a1 2003-11-23 devnull blkio(oblock, obuff, 0);
1102 bc7cb1a1 2003-11-23 devnull oblock = bno;
1103 bc7cb1a1 2003-11-23 devnull return (Rune*)(obuff+off);
1104 bc7cb1a1 2003-11-23 devnull }
1105 bc7cb1a1 2003-11-23 devnull
1106 bc7cb1a1 2003-11-23 devnull void
1107 bc7cb1a1 2003-11-23 devnull init(void)
1108 bc7cb1a1 2003-11-23 devnull {
1109 bc7cb1a1 2003-11-23 devnull int *markp;
1110 bc7cb1a1 2003-11-23 devnull
1111 bc7cb1a1 2003-11-23 devnull close(tfile);
1112 bc7cb1a1 2003-11-23 devnull tline = 2;
1113 bc7cb1a1 2003-11-23 devnull for(markp = names; markp < &names[26]; )
1114 bc7cb1a1 2003-11-23 devnull *markp++ = 0;
1115 bc7cb1a1 2003-11-23 devnull subnewa = 0;
1116 bc7cb1a1 2003-11-23 devnull anymarks = 0;
1117 bc7cb1a1 2003-11-23 devnull iblock = -1;
1118 bc7cb1a1 2003-11-23 devnull oblock = -1;
1119 bc7cb1a1 2003-11-23 devnull ichanged = 0;
1120 bc7cb1a1 2003-11-23 devnull if((tfile = create(tfname, ORDWR, 0600)) < 0){
1121 bc7cb1a1 2003-11-23 devnull error1(T);
1122 bc7cb1a1 2003-11-23 devnull exits(0);
1123 bc7cb1a1 2003-11-23 devnull }
1124 bc7cb1a1 2003-11-23 devnull dot = dol = zero;
1125 bc7cb1a1 2003-11-23 devnull }
1126 bc7cb1a1 2003-11-23 devnull
1127 bc7cb1a1 2003-11-23 devnull void
1128 bc7cb1a1 2003-11-23 devnull global(int k)
1129 bc7cb1a1 2003-11-23 devnull {
1130 bc7cb1a1 2003-11-23 devnull Rune *gp, globuf[GBSIZE];
1131 bc7cb1a1 2003-11-23 devnull int c, *a1;
1132 bc7cb1a1 2003-11-23 devnull
1133 bc7cb1a1 2003-11-23 devnull if(globp)
1134 bc7cb1a1 2003-11-23 devnull error(Q);
1135 bc7cb1a1 2003-11-23 devnull setwide();
1136 bc7cb1a1 2003-11-23 devnull squeeze(dol > zero);
1137 bc7cb1a1 2003-11-23 devnull c = getchr();
1138 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1139 bc7cb1a1 2003-11-23 devnull error(Q);
1140 bc7cb1a1 2003-11-23 devnull compile(c);
1141 bc7cb1a1 2003-11-23 devnull gp = globuf;
1142 bc7cb1a1 2003-11-23 devnull while((c=getchr()) != '\n') {
1143 bc7cb1a1 2003-11-23 devnull if(c == EOF)
1144 bc7cb1a1 2003-11-23 devnull error(Q);
1145 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1146 bc7cb1a1 2003-11-23 devnull c = getchr();
1147 bc7cb1a1 2003-11-23 devnull if(c != '\n')
1148 bc7cb1a1 2003-11-23 devnull *gp++ = '\\';
1149 bc7cb1a1 2003-11-23 devnull }
1150 bc7cb1a1 2003-11-23 devnull *gp++ = c;
1151 bc7cb1a1 2003-11-23 devnull if(gp >= &globuf[GBSIZE-2])
1152 bc7cb1a1 2003-11-23 devnull error(Q);
1153 bc7cb1a1 2003-11-23 devnull }
1154 bc7cb1a1 2003-11-23 devnull if(gp == globuf)
1155 bc7cb1a1 2003-11-23 devnull *gp++ = 'p';
1156 bc7cb1a1 2003-11-23 devnull *gp++ = '\n';
1157 bc7cb1a1 2003-11-23 devnull *gp = 0;
1158 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1159 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1160 bc7cb1a1 2003-11-23 devnull if(a1 >= addr1 && a1 <= addr2 && match(a1) == k)
1161 bc7cb1a1 2003-11-23 devnull *a1 |= 01;
1162 bc7cb1a1 2003-11-23 devnull }
1163 bc7cb1a1 2003-11-23 devnull
1164 bc7cb1a1 2003-11-23 devnull /*
1165 bc7cb1a1 2003-11-23 devnull * Special case: g/.../d (avoid n^2 algorithm)
1166 bc7cb1a1 2003-11-23 devnull */
1167 bc7cb1a1 2003-11-23 devnull if(globuf[0] == 'd' && globuf[1] == '\n' && globuf[2] == 0) {
1168 bc7cb1a1 2003-11-23 devnull gdelete();
1169 bc7cb1a1 2003-11-23 devnull return;
1170 bc7cb1a1 2003-11-23 devnull }
1171 bc7cb1a1 2003-11-23 devnull for(a1=zero; a1<=dol; a1++) {
1172 bc7cb1a1 2003-11-23 devnull if(*a1 & 01) {
1173 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1174 bc7cb1a1 2003-11-23 devnull dot = a1;
1175 bc7cb1a1 2003-11-23 devnull globp = globuf;
1176 bc7cb1a1 2003-11-23 devnull commands();
1177 bc7cb1a1 2003-11-23 devnull a1 = zero;
1178 bc7cb1a1 2003-11-23 devnull }
1179 bc7cb1a1 2003-11-23 devnull }
1180 bc7cb1a1 2003-11-23 devnull }
1181 bc7cb1a1 2003-11-23 devnull
1182 bc7cb1a1 2003-11-23 devnull void
1183 bc7cb1a1 2003-11-23 devnull join(void)
1184 bc7cb1a1 2003-11-23 devnull {
1185 bc7cb1a1 2003-11-23 devnull Rune *gp, *lp;
1186 bc7cb1a1 2003-11-23 devnull int *a1;
1187 bc7cb1a1 2003-11-23 devnull
1188 bc7cb1a1 2003-11-23 devnull nonzero();
1189 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1190 bc7cb1a1 2003-11-23 devnull for(a1=addr1; a1<=addr2; a1++) {
1191 bc7cb1a1 2003-11-23 devnull lp = getline(*a1);
1192 bc7cb1a1 2003-11-23 devnull while(*gp = *lp++)
1193 bc7cb1a1 2003-11-23 devnull if(gp++ >= &genbuf[LBSIZE-2])
1194 bc7cb1a1 2003-11-23 devnull error(Q);
1195 bc7cb1a1 2003-11-23 devnull }
1196 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1197 bc7cb1a1 2003-11-23 devnull gp = genbuf;
1198 bc7cb1a1 2003-11-23 devnull while(*lp++ = *gp++)
1199 bc7cb1a1 2003-11-23 devnull ;
1200 bc7cb1a1 2003-11-23 devnull *addr1 = putline();
1201 bc7cb1a1 2003-11-23 devnull if(addr1 < addr2)
1202 bc7cb1a1 2003-11-23 devnull rdelete(addr1+1, addr2);
1203 bc7cb1a1 2003-11-23 devnull dot = addr1;
1204 bc7cb1a1 2003-11-23 devnull }
1205 bc7cb1a1 2003-11-23 devnull
1206 bc7cb1a1 2003-11-23 devnull void
1207 bc7cb1a1 2003-11-23 devnull substitute(int inglob)
1208 bc7cb1a1 2003-11-23 devnull {
1209 bc7cb1a1 2003-11-23 devnull int *mp, *a1, nl, gsubf, n;
1210 bc7cb1a1 2003-11-23 devnull
1211 bc7cb1a1 2003-11-23 devnull n = getnum(); /* OK even if n==0 */
1212 bc7cb1a1 2003-11-23 devnull gsubf = compsub();
1213 bc7cb1a1 2003-11-23 devnull for(a1 = addr1; a1 <= addr2; a1++) {
1214 bc7cb1a1 2003-11-23 devnull if(match(a1)){
1215 bc7cb1a1 2003-11-23 devnull int *ozero;
1216 bc7cb1a1 2003-11-23 devnull int m = n;
1217 bc7cb1a1 2003-11-23 devnull
1218 bc7cb1a1 2003-11-23 devnull do {
1219 bc7cb1a1 2003-11-23 devnull int span = loc2-loc1;
1220 bc7cb1a1 2003-11-23 devnull
1221 bc7cb1a1 2003-11-23 devnull if(--m <= 0) {
1222 bc7cb1a1 2003-11-23 devnull dosub();
1223 bc7cb1a1 2003-11-23 devnull if(!gsubf)
1224 bc7cb1a1 2003-11-23 devnull break;
1225 bc7cb1a1 2003-11-23 devnull if(span == 0) { /* null RE match */
1226 bc7cb1a1 2003-11-23 devnull if(*loc2 == 0)
1227 bc7cb1a1 2003-11-23 devnull break;
1228 bc7cb1a1 2003-11-23 devnull loc2++;
1229 bc7cb1a1 2003-11-23 devnull }
1230 bc7cb1a1 2003-11-23 devnull }
1231 bc7cb1a1 2003-11-23 devnull } while(match(0));
1232 bc7cb1a1 2003-11-23 devnull if(m <= 0) {
1233 bc7cb1a1 2003-11-23 devnull inglob |= 01;
1234 bc7cb1a1 2003-11-23 devnull subnewa = putline();
1235 bc7cb1a1 2003-11-23 devnull *a1 &= ~01;
1236 bc7cb1a1 2003-11-23 devnull if(anymarks) {
1237 bc7cb1a1 2003-11-23 devnull for(mp=names; mp<&names[26]; mp++)
1238 bc7cb1a1 2003-11-23 devnull if(*mp == *a1)
1239 bc7cb1a1 2003-11-23 devnull *mp = subnewa;
1240 bc7cb1a1 2003-11-23 devnull }
1241 bc7cb1a1 2003-11-23 devnull subolda = *a1;
1242 bc7cb1a1 2003-11-23 devnull *a1 = subnewa;
1243 bc7cb1a1 2003-11-23 devnull ozero = zero;
1244 bc7cb1a1 2003-11-23 devnull nl = append(getsub, a1);
1245 bc7cb1a1 2003-11-23 devnull addr2 += nl;
1246 bc7cb1a1 2003-11-23 devnull nl += zero-ozero;
1247 bc7cb1a1 2003-11-23 devnull a1 += nl;
1248 bc7cb1a1 2003-11-23 devnull }
1249 bc7cb1a1 2003-11-23 devnull }
1250 bc7cb1a1 2003-11-23 devnull }
1251 bc7cb1a1 2003-11-23 devnull if(inglob == 0)
1252 bc7cb1a1 2003-11-23 devnull error(Q);
1253 bc7cb1a1 2003-11-23 devnull }
1254 bc7cb1a1 2003-11-23 devnull
1255 bc7cb1a1 2003-11-23 devnull int
1256 bc7cb1a1 2003-11-23 devnull compsub(void)
1257 bc7cb1a1 2003-11-23 devnull {
1258 bc7cb1a1 2003-11-23 devnull int seof, c;
1259 bc7cb1a1 2003-11-23 devnull Rune *p;
1260 bc7cb1a1 2003-11-23 devnull
1261 bc7cb1a1 2003-11-23 devnull seof = getchr();
1262 bc7cb1a1 2003-11-23 devnull if(seof == '\n' || seof == ' ')
1263 bc7cb1a1 2003-11-23 devnull error(Q);
1264 bc7cb1a1 2003-11-23 devnull compile(seof);
1265 bc7cb1a1 2003-11-23 devnull p = rhsbuf;
1266 bc7cb1a1 2003-11-23 devnull for(;;) {
1267 bc7cb1a1 2003-11-23 devnull c = getchr();
1268 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1269 bc7cb1a1 2003-11-23 devnull c = getchr();
1270 bc7cb1a1 2003-11-23 devnull *p++ = ESCFLG;
1271 cfa81d56 2009-09-16 russcox if(p >= &rhsbuf[LBSIZE/sizeof(Rune)])
1272 bc7cb1a1 2003-11-23 devnull error(Q);
1273 bc7cb1a1 2003-11-23 devnull } else
1274 bc7cb1a1 2003-11-23 devnull if(c == '\n' && (!globp || !globp[0])) {
1275 bc7cb1a1 2003-11-23 devnull peekc = c;
1276 bc7cb1a1 2003-11-23 devnull pflag++;
1277 bc7cb1a1 2003-11-23 devnull break;
1278 bc7cb1a1 2003-11-23 devnull } else
1279 bc7cb1a1 2003-11-23 devnull if(c == seof)
1280 bc7cb1a1 2003-11-23 devnull break;
1281 bc7cb1a1 2003-11-23 devnull *p++ = c;
1282 cfa81d56 2009-09-16 russcox if(p >= &rhsbuf[LBSIZE/sizeof(Rune)])
1283 bc7cb1a1 2003-11-23 devnull error(Q);
1284 bc7cb1a1 2003-11-23 devnull }
1285 bc7cb1a1 2003-11-23 devnull *p = 0;
1286 bc7cb1a1 2003-11-23 devnull peekc = getchr();
1287 bc7cb1a1 2003-11-23 devnull if(peekc == 'g') {
1288 bc7cb1a1 2003-11-23 devnull peekc = 0;
1289 bc7cb1a1 2003-11-23 devnull newline();
1290 bc7cb1a1 2003-11-23 devnull return 1;
1291 bc7cb1a1 2003-11-23 devnull }
1292 bc7cb1a1 2003-11-23 devnull newline();
1293 bc7cb1a1 2003-11-23 devnull return 0;
1294 bc7cb1a1 2003-11-23 devnull }
1295 bc7cb1a1 2003-11-23 devnull
1296 bc7cb1a1 2003-11-23 devnull int
1297 bc7cb1a1 2003-11-23 devnull getsub(void)
1298 bc7cb1a1 2003-11-23 devnull {
1299 bc7cb1a1 2003-11-23 devnull Rune *p1, *p2;
1300 bc7cb1a1 2003-11-23 devnull
1301 bc7cb1a1 2003-11-23 devnull p1 = linebuf;
1302 bc7cb1a1 2003-11-23 devnull if((p2 = linebp) == 0)
1303 bc7cb1a1 2003-11-23 devnull return EOF;
1304 bc7cb1a1 2003-11-23 devnull while(*p1++ = *p2++)
1305 bc7cb1a1 2003-11-23 devnull ;
1306 bc7cb1a1 2003-11-23 devnull linebp = 0;
1307 bc7cb1a1 2003-11-23 devnull return 0;
1308 bc7cb1a1 2003-11-23 devnull }
1309 bc7cb1a1 2003-11-23 devnull
1310 bc7cb1a1 2003-11-23 devnull void
1311 bc7cb1a1 2003-11-23 devnull dosub(void)
1312 bc7cb1a1 2003-11-23 devnull {
1313 bc7cb1a1 2003-11-23 devnull Rune *lp, *sp, *rp;
1314 bc7cb1a1 2003-11-23 devnull int c, n;
1315 bc7cb1a1 2003-11-23 devnull
1316 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1317 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1318 bc7cb1a1 2003-11-23 devnull rp = rhsbuf;
1319 bc7cb1a1 2003-11-23 devnull while(lp < loc1)
1320 bc7cb1a1 2003-11-23 devnull *sp++ = *lp++;
1321 bc7cb1a1 2003-11-23 devnull while(c = *rp++) {
1322 bc7cb1a1 2003-11-23 devnull if(c == '&'){
1323 bc7cb1a1 2003-11-23 devnull sp = place(sp, loc1, loc2);
1324 bc7cb1a1 2003-11-23 devnull continue;
1325 bc7cb1a1 2003-11-23 devnull }
1326 bc7cb1a1 2003-11-23 devnull if(c == ESCFLG && (c = *rp++) >= '1' && c < MAXSUB+'0') {
1327 bc7cb1a1 2003-11-23 devnull n = c-'0';
1328 bc7cb1a1 2003-11-23 devnull if(subexp[n].s.rsp && subexp[n].e.rep) {
1329 bc7cb1a1 2003-11-23 devnull sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep);
1330 bc7cb1a1 2003-11-23 devnull continue;
1331 bc7cb1a1 2003-11-23 devnull }
1332 bc7cb1a1 2003-11-23 devnull error(Q);
1333 bc7cb1a1 2003-11-23 devnull }
1334 bc7cb1a1 2003-11-23 devnull *sp++ = c;
1335 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1336 bc7cb1a1 2003-11-23 devnull error(Q);
1337 bc7cb1a1 2003-11-23 devnull }
1338 bc7cb1a1 2003-11-23 devnull lp = loc2;
1339 bc7cb1a1 2003-11-23 devnull loc2 = sp - genbuf + linebuf;
1340 bc7cb1a1 2003-11-23 devnull while(*sp++ = *lp++)
1341 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1342 bc7cb1a1 2003-11-23 devnull error(Q);
1343 bc7cb1a1 2003-11-23 devnull lp = linebuf;
1344 bc7cb1a1 2003-11-23 devnull sp = genbuf;
1345 bc7cb1a1 2003-11-23 devnull while(*lp++ = *sp++)
1346 bc7cb1a1 2003-11-23 devnull ;
1347 bc7cb1a1 2003-11-23 devnull }
1348 bc7cb1a1 2003-11-23 devnull
1349 bc7cb1a1 2003-11-23 devnull Rune*
1350 bc7cb1a1 2003-11-23 devnull place(Rune *sp, Rune *l1, Rune *l2)
1351 bc7cb1a1 2003-11-23 devnull {
1352 bc7cb1a1 2003-11-23 devnull
1353 bc7cb1a1 2003-11-23 devnull while(l1 < l2) {
1354 bc7cb1a1 2003-11-23 devnull *sp++ = *l1++;
1355 bc7cb1a1 2003-11-23 devnull if(sp >= &genbuf[LBSIZE])
1356 bc7cb1a1 2003-11-23 devnull error(Q);
1357 bc7cb1a1 2003-11-23 devnull }
1358 bc7cb1a1 2003-11-23 devnull return sp;
1359 bc7cb1a1 2003-11-23 devnull }
1360 bc7cb1a1 2003-11-23 devnull
1361 bc7cb1a1 2003-11-23 devnull void
1362 bc7cb1a1 2003-11-23 devnull move(int cflag)
1363 bc7cb1a1 2003-11-23 devnull {
1364 bc7cb1a1 2003-11-23 devnull int *adt, *ad1, *ad2;
1365 bc7cb1a1 2003-11-23 devnull
1366 bc7cb1a1 2003-11-23 devnull nonzero();
1367 bc7cb1a1 2003-11-23 devnull if((adt = address())==0) /* address() guarantees addr is in range */
1368 bc7cb1a1 2003-11-23 devnull error(Q);
1369 bc7cb1a1 2003-11-23 devnull newline();
1370 bc7cb1a1 2003-11-23 devnull if(cflag) {
1371 bc7cb1a1 2003-11-23 devnull int *ozero, delta;
1372 bc7cb1a1 2003-11-23 devnull ad1 = dol;
1373 bc7cb1a1 2003-11-23 devnull ozero = zero;
1374 bc7cb1a1 2003-11-23 devnull append(getcopy, ad1++);
1375 bc7cb1a1 2003-11-23 devnull ad2 = dol;
1376 bc7cb1a1 2003-11-23 devnull delta = zero - ozero;
1377 bc7cb1a1 2003-11-23 devnull ad1 += delta;
1378 bc7cb1a1 2003-11-23 devnull adt += delta;
1379 bc7cb1a1 2003-11-23 devnull } else {
1380 bc7cb1a1 2003-11-23 devnull ad2 = addr2;
1381 bc7cb1a1 2003-11-23 devnull for(ad1 = addr1; ad1 <= ad2;)
1382 bc7cb1a1 2003-11-23 devnull *ad1++ &= ~01;
1383 bc7cb1a1 2003-11-23 devnull ad1 = addr1;
1384 bc7cb1a1 2003-11-23 devnull }
1385 bc7cb1a1 2003-11-23 devnull ad2++;
1386 bc7cb1a1 2003-11-23 devnull if(adt<ad1) {
1387 bc7cb1a1 2003-11-23 devnull dot = adt + (ad2-ad1);
1388 bc7cb1a1 2003-11-23 devnull if((++adt)==ad1)
1389 bc7cb1a1 2003-11-23 devnull return;
1390 bc7cb1a1 2003-11-23 devnull reverse(adt, ad1);
1391 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1392 bc7cb1a1 2003-11-23 devnull reverse(adt, ad2);
1393 bc7cb1a1 2003-11-23 devnull } else
1394 bc7cb1a1 2003-11-23 devnull if(adt >= ad2) {
1395 bc7cb1a1 2003-11-23 devnull dot = adt++;
1396 bc7cb1a1 2003-11-23 devnull reverse(ad1, ad2);
1397 bc7cb1a1 2003-11-23 devnull reverse(ad2, adt);
1398 bc7cb1a1 2003-11-23 devnull reverse(ad1, adt);
1399 bc7cb1a1 2003-11-23 devnull } else
1400 bc7cb1a1 2003-11-23 devnull error(Q);
1401 bc7cb1a1 2003-11-23 devnull fchange = 1;
1402 bc7cb1a1 2003-11-23 devnull }
1403 bc7cb1a1 2003-11-23 devnull
1404 bc7cb1a1 2003-11-23 devnull void
1405 bc7cb1a1 2003-11-23 devnull reverse(int *a1, int *a2)
1406 bc7cb1a1 2003-11-23 devnull {
1407 bc7cb1a1 2003-11-23 devnull int t;
1408 bc7cb1a1 2003-11-23 devnull
1409 bc7cb1a1 2003-11-23 devnull for(;;) {
1410 bc7cb1a1 2003-11-23 devnull t = *--a2;
1411 bc7cb1a1 2003-11-23 devnull if(a2 <= a1)
1412 bc7cb1a1 2003-11-23 devnull return;
1413 bc7cb1a1 2003-11-23 devnull *a2 = *a1;
1414 bc7cb1a1 2003-11-23 devnull *a1++ = t;
1415 bc7cb1a1 2003-11-23 devnull }
1416 bc7cb1a1 2003-11-23 devnull }
1417 bc7cb1a1 2003-11-23 devnull
1418 bc7cb1a1 2003-11-23 devnull int
1419 bc7cb1a1 2003-11-23 devnull getcopy(void)
1420 bc7cb1a1 2003-11-23 devnull {
1421 bc7cb1a1 2003-11-23 devnull if(addr1 > addr2)
1422 bc7cb1a1 2003-11-23 devnull return EOF;
1423 bc7cb1a1 2003-11-23 devnull getline(*addr1++);
1424 bc7cb1a1 2003-11-23 devnull return 0;
1425 bc7cb1a1 2003-11-23 devnull }
1426 bc7cb1a1 2003-11-23 devnull
1427 bc7cb1a1 2003-11-23 devnull void
1428 bc7cb1a1 2003-11-23 devnull compile(int eof)
1429 bc7cb1a1 2003-11-23 devnull {
1430 bc7cb1a1 2003-11-23 devnull Rune c;
1431 bc7cb1a1 2003-11-23 devnull char *ep;
1432 bc7cb1a1 2003-11-23 devnull char expbuf[ESIZE];
1433 bc7cb1a1 2003-11-23 devnull
1434 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1435 bc7cb1a1 2003-11-23 devnull peekc = c;
1436 bc7cb1a1 2003-11-23 devnull c = eof;
1437 bc7cb1a1 2003-11-23 devnull }
1438 bc7cb1a1 2003-11-23 devnull if(c == eof) {
1439 bc7cb1a1 2003-11-23 devnull if(!pattern)
1440 bc7cb1a1 2003-11-23 devnull error(Q);
1441 bc7cb1a1 2003-11-23 devnull return;
1442 bc7cb1a1 2003-11-23 devnull }
1443 bc7cb1a1 2003-11-23 devnull if(pattern) {
1444 bc7cb1a1 2003-11-23 devnull free(pattern);
1445 bc7cb1a1 2003-11-23 devnull pattern = 0;
1446 bc7cb1a1 2003-11-23 devnull }
1447 bc7cb1a1 2003-11-23 devnull ep = expbuf;
1448 bc7cb1a1 2003-11-23 devnull do {
1449 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
1450 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1451 bc7cb1a1 2003-11-23 devnull error(Q);
1452 bc7cb1a1 2003-11-23 devnull return;
1453 bc7cb1a1 2003-11-23 devnull }
1454 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1455 bc7cb1a1 2003-11-23 devnull if((c = getchr()) == '\n') {
1456 bc7cb1a1 2003-11-23 devnull error(Q);
1457 bc7cb1a1 2003-11-23 devnull return;
1458 bc7cb1a1 2003-11-23 devnull }
1459 bc7cb1a1 2003-11-23 devnull }
1460 bc7cb1a1 2003-11-23 devnull if(ep >= expbuf+sizeof(expbuf)) {
1461 bc7cb1a1 2003-11-23 devnull error(Q);
1462 bc7cb1a1 2003-11-23 devnull return;
1463 bc7cb1a1 2003-11-23 devnull }
1464 bc7cb1a1 2003-11-23 devnull ep += runetochar(ep, &c);
1465 bc7cb1a1 2003-11-23 devnull } while((c = getchr()) != eof && c != '\n');
1466 bc7cb1a1 2003-11-23 devnull if(c == '\n')
1467 bc7cb1a1 2003-11-23 devnull peekc = c;
1468 bc7cb1a1 2003-11-23 devnull *ep = 0;
1469 bc7cb1a1 2003-11-23 devnull pattern = regcomp(expbuf);
1470 bc7cb1a1 2003-11-23 devnull }
1471 bc7cb1a1 2003-11-23 devnull
1472 bc7cb1a1 2003-11-23 devnull int
1473 bc7cb1a1 2003-11-23 devnull match(int *addr)
1474 bc7cb1a1 2003-11-23 devnull {
1475 bc7cb1a1 2003-11-23 devnull if(!pattern)
1476 bc7cb1a1 2003-11-23 devnull return 0;
1477 bc7cb1a1 2003-11-23 devnull if(addr){
1478 bc7cb1a1 2003-11-23 devnull if(addr == zero)
1479 bc7cb1a1 2003-11-23 devnull return 0;
1480 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = getline(*addr);
1481 bc7cb1a1 2003-11-23 devnull } else
1482 bc7cb1a1 2003-11-23 devnull subexp[0].s.rsp = loc2;
1483 bc7cb1a1 2003-11-23 devnull subexp[0].e.rep = 0;
1484 bc7cb1a1 2003-11-23 devnull if(rregexec(pattern, linebuf, subexp, MAXSUB)) {
1485 bc7cb1a1 2003-11-23 devnull loc1 = subexp[0].s.rsp;
1486 bc7cb1a1 2003-11-23 devnull loc2 = subexp[0].e.rep;
1487 bc7cb1a1 2003-11-23 devnull return 1;
1488 bc7cb1a1 2003-11-23 devnull }
1489 bc7cb1a1 2003-11-23 devnull loc1 = loc2 = 0;
1490 bc7cb1a1 2003-11-23 devnull return 0;
1491 bc7cb1a1 2003-11-23 devnull
1492 bc7cb1a1 2003-11-23 devnull }
1493 bc7cb1a1 2003-11-23 devnull
1494 bc7cb1a1 2003-11-23 devnull void
1495 bc7cb1a1 2003-11-23 devnull putd(void)
1496 bc7cb1a1 2003-11-23 devnull {
1497 bc7cb1a1 2003-11-23 devnull int r;
1498 bc7cb1a1 2003-11-23 devnull
1499 bc7cb1a1 2003-11-23 devnull r = count%10;
1500 bc7cb1a1 2003-11-23 devnull count /= 10;
1501 bc7cb1a1 2003-11-23 devnull if(count)
1502 bc7cb1a1 2003-11-23 devnull putd();
1503 bb0266fe 2005-05-07 devnull putchr(r + '0');
1504 bc7cb1a1 2003-11-23 devnull }
1505 bc7cb1a1 2003-11-23 devnull
1506 bc7cb1a1 2003-11-23 devnull void
1507 bc7cb1a1 2003-11-23 devnull putst(char *sp)
1508 bc7cb1a1 2003-11-23 devnull {
1509 bc7cb1a1 2003-11-23 devnull Rune r;
1510 bc7cb1a1 2003-11-23 devnull
1511 bc7cb1a1 2003-11-23 devnull col = 0;
1512 bc7cb1a1 2003-11-23 devnull for(;;) {
1513 bc7cb1a1 2003-11-23 devnull sp += chartorune(&r, sp);
1514 bc7cb1a1 2003-11-23 devnull if(r == 0)
1515 bc7cb1a1 2003-11-23 devnull break;
1516 bc7cb1a1 2003-11-23 devnull putchr(r);
1517 bc7cb1a1 2003-11-23 devnull }
1518 bb0266fe 2005-05-07 devnull putchr('\n');
1519 bc7cb1a1 2003-11-23 devnull }
1520 bc7cb1a1 2003-11-23 devnull
1521 bc7cb1a1 2003-11-23 devnull void
1522 bc7cb1a1 2003-11-23 devnull putshst(Rune *sp)
1523 bc7cb1a1 2003-11-23 devnull {
1524 bc7cb1a1 2003-11-23 devnull col = 0;
1525 bc7cb1a1 2003-11-23 devnull while(*sp)
1526 bc7cb1a1 2003-11-23 devnull putchr(*sp++);
1527 bb0266fe 2005-05-07 devnull putchr('\n');
1528 bc7cb1a1 2003-11-23 devnull }
1529 bc7cb1a1 2003-11-23 devnull
1530 bc7cb1a1 2003-11-23 devnull void
1531 bc7cb1a1 2003-11-23 devnull putchr(int ac)
1532 bc7cb1a1 2003-11-23 devnull {
1533 bc7cb1a1 2003-11-23 devnull char *lp;
1534 bc7cb1a1 2003-11-23 devnull int c;
1535 bc7cb1a1 2003-11-23 devnull Rune rune;
1536 bc7cb1a1 2003-11-23 devnull
1537 bc7cb1a1 2003-11-23 devnull lp = linp;
1538 bc7cb1a1 2003-11-23 devnull c = ac;
1539 bc7cb1a1 2003-11-23 devnull if(listf) {
1540 bc7cb1a1 2003-11-23 devnull if(c == '\n') {
1541 bc7cb1a1 2003-11-23 devnull if(linp != line && linp[-1] == ' ') {
1542 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1543 bc7cb1a1 2003-11-23 devnull *lp++ = 'n';
1544 bc7cb1a1 2003-11-23 devnull }
1545 bc7cb1a1 2003-11-23 devnull } else {
1546 bc7cb1a1 2003-11-23 devnull if(col > (72-6-2)) {
1547 bc7cb1a1 2003-11-23 devnull col = 8;
1548 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1549 bc7cb1a1 2003-11-23 devnull *lp++ = '\n';
1550 bc7cb1a1 2003-11-23 devnull *lp++ = '\t';
1551 bc7cb1a1 2003-11-23 devnull }
1552 bc7cb1a1 2003-11-23 devnull col++;
1553 bc7cb1a1 2003-11-23 devnull if(c=='\b' || c=='\t' || c=='\\') {
1554 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1555 bc7cb1a1 2003-11-23 devnull if(c == '\b')
1556 bc7cb1a1 2003-11-23 devnull c = 'b';
1557 bc7cb1a1 2003-11-23 devnull else
1558 bc7cb1a1 2003-11-23 devnull if(c == '\t')
1559 bc7cb1a1 2003-11-23 devnull c = 't';
1560 bc7cb1a1 2003-11-23 devnull col++;
1561 bc7cb1a1 2003-11-23 devnull } else
1562 bc7cb1a1 2003-11-23 devnull if(c<' ' || c>='\177') {
1563 bc7cb1a1 2003-11-23 devnull *lp++ = '\\';
1564 bc7cb1a1 2003-11-23 devnull *lp++ = 'x';
1565 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>12];
1566 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>8&0xF];
1567 bc7cb1a1 2003-11-23 devnull *lp++ = hex[c>>4&0xF];
1568 bc7cb1a1 2003-11-23 devnull c = hex[c&0xF];
1569 bc7cb1a1 2003-11-23 devnull col += 5;
1570 bc7cb1a1 2003-11-23 devnull }
1571 bc7cb1a1 2003-11-23 devnull }
1572 bc7cb1a1 2003-11-23 devnull }
1573 bc7cb1a1 2003-11-23 devnull
1574 bc7cb1a1 2003-11-23 devnull rune = c;
1575 bc7cb1a1 2003-11-23 devnull lp += runetochar(lp, &rune);
1576 bc7cb1a1 2003-11-23 devnull
1577 bc7cb1a1 2003-11-23 devnull if(c == '\n' || lp >= &line[sizeof(line)-5]) {
1578 bc7cb1a1 2003-11-23 devnull linp = line;
1579 bc7cb1a1 2003-11-23 devnull write(oflag? 2: 1, line, lp-line);
1580 bc7cb1a1 2003-11-23 devnull return;
1581 bc7cb1a1 2003-11-23 devnull }
1582 bc7cb1a1 2003-11-23 devnull linp = lp;
1583 bc7cb1a1 2003-11-23 devnull }
1584 bc7cb1a1 2003-11-23 devnull
1585 bc7cb1a1 2003-11-23 devnull char*
1586 bc7cb1a1 2003-11-23 devnull mktemp(char *as)
1587 bc7cb1a1 2003-11-23 devnull {
1588 bc7cb1a1 2003-11-23 devnull char *s;
1589 bc7cb1a1 2003-11-23 devnull unsigned pid;
1590 bc7cb1a1 2003-11-23 devnull int i;
1591 bc7cb1a1 2003-11-23 devnull
1592 bc7cb1a1 2003-11-23 devnull pid = getpid();
1593 bc7cb1a1 2003-11-23 devnull s = as;
1594 bc7cb1a1 2003-11-23 devnull while(*s++)
1595 bc7cb1a1 2003-11-23 devnull ;
1596 bc7cb1a1 2003-11-23 devnull s--;
1597 bc7cb1a1 2003-11-23 devnull while(*--s == 'X') {
1598 bc7cb1a1 2003-11-23 devnull *s = pid % 10 + '0';
1599 bc7cb1a1 2003-11-23 devnull pid /= 10;
1600 bc7cb1a1 2003-11-23 devnull }
1601 bc7cb1a1 2003-11-23 devnull s++;
1602 bc7cb1a1 2003-11-23 devnull i = 'a';
1603 bc7cb1a1 2003-11-23 devnull while(access(as, 0) != -1) {
1604 bc7cb1a1 2003-11-23 devnull if(i == 'z')
1605 bc7cb1a1 2003-11-23 devnull return "/";
1606 bc7cb1a1 2003-11-23 devnull *s = i++;
1607 bc7cb1a1 2003-11-23 devnull }
1608 bc7cb1a1 2003-11-23 devnull return as;
1609 bc7cb1a1 2003-11-23 devnull }
1610 bc7cb1a1 2003-11-23 devnull
1611 bc7cb1a1 2003-11-23 devnull void
1612 bc7cb1a1 2003-11-23 devnull regerror(char *s)
1613 bc7cb1a1 2003-11-23 devnull {
1614 bc7cb1a1 2003-11-23 devnull USED(s);
1615 bc7cb1a1 2003-11-23 devnull error(Q);
1616 bc7cb1a1 2003-11-23 devnull }