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