Blame


1 bc7cb1a1 2003-11-23 devnull /*
2 bc7cb1a1 2003-11-23 devnull * interactive diff, inspired/stolen from
3 bc7cb1a1 2003-11-23 devnull * kernighan and pike, _unix programming environment_.
4 bc7cb1a1 2003-11-23 devnull */
5 bc7cb1a1 2003-11-23 devnull
6 bc7cb1a1 2003-11-23 devnull #include <u.h>
7 bc7cb1a1 2003-11-23 devnull #include <libc.h>
8 bc7cb1a1 2003-11-23 devnull #include <bio.h>
9 ca0c710c 2004-03-21 devnull
10 ca0c710c 2004-03-21 devnull #define opentemp idiffopentemp
11 bc7cb1a1 2003-11-23 devnull
12 bc7cb1a1 2003-11-23 devnull int diffbflag;
13 bc7cb1a1 2003-11-23 devnull int diffwflag;
14 bc7cb1a1 2003-11-23 devnull
15 bc7cb1a1 2003-11-23 devnull void copy(Biobuf*, char*, Biobuf*, char*);
16 bc7cb1a1 2003-11-23 devnull void idiff(Biobuf*, char*, Biobuf*, char*, Biobuf*, char*, Biobuf*, char*);
17 bc7cb1a1 2003-11-23 devnull int opentemp(char*, int, long);
18 bc7cb1a1 2003-11-23 devnull void rundiff(char*, char*, int);
19 bc7cb1a1 2003-11-23 devnull
20 bc7cb1a1 2003-11-23 devnull void
21 bc7cb1a1 2003-11-23 devnull usage(void)
22 bc7cb1a1 2003-11-23 devnull {
23 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: idiff [-bw] file1 file2\n");
24 bc7cb1a1 2003-11-23 devnull exits("usage");
25 bc7cb1a1 2003-11-23 devnull }
26 bc7cb1a1 2003-11-23 devnull
27 bc7cb1a1 2003-11-23 devnull void
28 bc7cb1a1 2003-11-23 devnull main(int argc, char **argv)
29 bc7cb1a1 2003-11-23 devnull {
30 bc7cb1a1 2003-11-23 devnull int fd, ofd;
31 bc7cb1a1 2003-11-23 devnull char diffout[40], idiffout[40];
32 bc7cb1a1 2003-11-23 devnull Biobuf *b1, *b2, bdiff, bout, bstdout;
33 bc7cb1a1 2003-11-23 devnull Dir *d;
34 bc7cb1a1 2003-11-23 devnull
35 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
36 bc7cb1a1 2003-11-23 devnull default:
37 bc7cb1a1 2003-11-23 devnull usage();
38 bc7cb1a1 2003-11-23 devnull case 'b':
39 bc7cb1a1 2003-11-23 devnull diffbflag++;
40 bc7cb1a1 2003-11-23 devnull break;
41 bc7cb1a1 2003-11-23 devnull case 'w':
42 bc7cb1a1 2003-11-23 devnull diffwflag++;
43 bc7cb1a1 2003-11-23 devnull break;
44 bc7cb1a1 2003-11-23 devnull }ARGEND
45 bc7cb1a1 2003-11-23 devnull
46 bc7cb1a1 2003-11-23 devnull if(argc != 2)
47 bc7cb1a1 2003-11-23 devnull usage();
48 bc7cb1a1 2003-11-23 devnull
49 bc7cb1a1 2003-11-23 devnull if((d = dirstat(argv[0])) == nil)
50 bc7cb1a1 2003-11-23 devnull sysfatal("stat %s: %r", argv[0]);
51 bc7cb1a1 2003-11-23 devnull if(d->mode&DMDIR)
52 bc7cb1a1 2003-11-23 devnull sysfatal("%s is a directory", argv[0]);
53 bc7cb1a1 2003-11-23 devnull free(d);
54 bc7cb1a1 2003-11-23 devnull if((d = dirstat(argv[1])) == nil)
55 bc7cb1a1 2003-11-23 devnull sysfatal("stat %s: %r", argv[1]);
56 bc7cb1a1 2003-11-23 devnull if(d->mode&DMDIR)
57 bc7cb1a1 2003-11-23 devnull sysfatal("%s is a directory", argv[1]);
58 bc7cb1a1 2003-11-23 devnull free(d);
59 bc7cb1a1 2003-11-23 devnull
60 bc7cb1a1 2003-11-23 devnull if((b1 = Bopen(argv[0], OREAD)) == nil)
61 bc7cb1a1 2003-11-23 devnull sysfatal("open %s: %r", argv[0]);
62 bc7cb1a1 2003-11-23 devnull if((b2 = Bopen(argv[1], OREAD)) == nil)
63 bc7cb1a1 2003-11-23 devnull sysfatal("open %s: %r", argv[1]);
64 bc7cb1a1 2003-11-23 devnull
65 bc7cb1a1 2003-11-23 devnull strcpy(diffout, "/tmp/idiff.XXXXXX");
66 bc7cb1a1 2003-11-23 devnull fd = opentemp(diffout, ORDWR|ORCLOSE, 0);
67 bc7cb1a1 2003-11-23 devnull strcpy(idiffout, "/tmp/idiff.XXXXXX");
68 bc7cb1a1 2003-11-23 devnull ofd = opentemp(idiffout, ORDWR|ORCLOSE, 0);
69 bc7cb1a1 2003-11-23 devnull rundiff(argv[0], argv[1], fd);
70 bc7cb1a1 2003-11-23 devnull seek(fd, 0, 0);
71 bc7cb1a1 2003-11-23 devnull Binit(&bdiff, fd, OREAD);
72 bc7cb1a1 2003-11-23 devnull Binit(&bout, ofd, OWRITE);
73 bc7cb1a1 2003-11-23 devnull idiff(b1, argv[0], b2, argv[1], &bdiff, diffout, &bout, idiffout);
74 bc7cb1a1 2003-11-23 devnull Bterm(&bdiff);
75 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
76 bc7cb1a1 2003-11-23 devnull seek(ofd, 0, 0);
77 bc7cb1a1 2003-11-23 devnull Binit(&bout, ofd, OREAD);
78 bc7cb1a1 2003-11-23 devnull Binit(&bstdout, 1, OWRITE);
79 bc7cb1a1 2003-11-23 devnull copy(&bout, idiffout, &bstdout, "<stdout>");
80 bc7cb1a1 2003-11-23 devnull exits(nil);
81 bc7cb1a1 2003-11-23 devnull }
82 bc7cb1a1 2003-11-23 devnull
83 bc7cb1a1 2003-11-23 devnull int
84 bc7cb1a1 2003-11-23 devnull opentemp(char *template, int mode, long perm)
85 bc7cb1a1 2003-11-23 devnull {
86 d2c4ee9e 2003-11-24 devnull int fd;
87 f7012583 2003-11-25 devnull Dir d;
88 bc7cb1a1 2003-11-23 devnull
89 d2c4ee9e 2003-11-24 devnull fd = mkstemp(template);
90 bc7cb1a1 2003-11-23 devnull if(fd < 0)
91 bc7cb1a1 2003-11-23 devnull sysfatal("could not create temporary file");
92 f7012583 2003-11-25 devnull nulldir(&d);
93 f7012583 2003-11-25 devnull d.mode = perm;
94 f7012583 2003-11-25 devnull dirfwstat(fd, &d);
95 bc7cb1a1 2003-11-23 devnull
96 bc7cb1a1 2003-11-23 devnull return fd;
97 bc7cb1a1 2003-11-23 devnull }
98 bc7cb1a1 2003-11-23 devnull
99 bc7cb1a1 2003-11-23 devnull void
100 bc7cb1a1 2003-11-23 devnull rundiff(char *arg1, char *arg2, int outfd)
101 bc7cb1a1 2003-11-23 devnull {
102 bc7cb1a1 2003-11-23 devnull char *arg[10], *p;
103 bc7cb1a1 2003-11-23 devnull int narg, pid;
104 bc7cb1a1 2003-11-23 devnull Waitmsg *w;
105 bc7cb1a1 2003-11-23 devnull
106 bc7cb1a1 2003-11-23 devnull narg = 0;
107 fcb69ec5 2005-07-14 devnull arg[narg++] = "9";
108 b4a659b6 2004-04-19 devnull arg[narg++] = "diff";
109 bc7cb1a1 2003-11-23 devnull arg[narg++] = "-n";
110 bc7cb1a1 2003-11-23 devnull if(diffbflag)
111 bc7cb1a1 2003-11-23 devnull arg[narg++] = "-b";
112 bc7cb1a1 2003-11-23 devnull if(diffwflag)
113 bc7cb1a1 2003-11-23 devnull arg[narg++] = "-w";
114 bc7cb1a1 2003-11-23 devnull arg[narg++] = arg1;
115 bc7cb1a1 2003-11-23 devnull arg[narg++] = arg2;
116 bc7cb1a1 2003-11-23 devnull arg[narg] = nil;
117 bc7cb1a1 2003-11-23 devnull
118 bc7cb1a1 2003-11-23 devnull switch(pid = fork()){
119 bc7cb1a1 2003-11-23 devnull case -1:
120 bc7cb1a1 2003-11-23 devnull sysfatal("fork: %r");
121 bc7cb1a1 2003-11-23 devnull
122 bc7cb1a1 2003-11-23 devnull case 0:
123 bc7cb1a1 2003-11-23 devnull dup(outfd, 1);
124 bc7cb1a1 2003-11-23 devnull close(0);
125 fcb69ec5 2005-07-14 devnull exec("9", arg);
126 bc7cb1a1 2003-11-23 devnull sysfatal("exec: %r");
127 bc7cb1a1 2003-11-23 devnull
128 bc7cb1a1 2003-11-23 devnull default:
129 bc7cb1a1 2003-11-23 devnull w = wait();
130 bc7cb1a1 2003-11-23 devnull if(w==nil)
131 bc7cb1a1 2003-11-23 devnull sysfatal("wait: %r");
132 bc7cb1a1 2003-11-23 devnull if(w->pid != pid)
133 bc7cb1a1 2003-11-23 devnull sysfatal("wait got unexpected pid %d", w->pid);
134 bc7cb1a1 2003-11-23 devnull if((p = strchr(w->msg, ':')) && strcmp(p, ": some") != 0)
135 bc7cb1a1 2003-11-23 devnull sysfatal("%s", w->msg);
136 bc7cb1a1 2003-11-23 devnull free(w);
137 bc7cb1a1 2003-11-23 devnull }
138 bc7cb1a1 2003-11-23 devnull }
139 bc7cb1a1 2003-11-23 devnull
140 bc7cb1a1 2003-11-23 devnull void
141 bc7cb1a1 2003-11-23 devnull runcmd(char *cmd)
142 bc7cb1a1 2003-11-23 devnull {
143 bc7cb1a1 2003-11-23 devnull char *arg[10];
144 bc7cb1a1 2003-11-23 devnull int narg, pid, wpid;
145 bc7cb1a1 2003-11-23 devnull
146 bc7cb1a1 2003-11-23 devnull narg = 0;
147 b4a659b6 2004-04-19 devnull arg[narg++] = "rc";
148 bc7cb1a1 2003-11-23 devnull arg[narg++] = "-c";
149 bc7cb1a1 2003-11-23 devnull arg[narg++] = cmd;
150 bc7cb1a1 2003-11-23 devnull arg[narg] = nil;
151 bc7cb1a1 2003-11-23 devnull
152 bc7cb1a1 2003-11-23 devnull switch(pid = fork()){
153 bc7cb1a1 2003-11-23 devnull case -1:
154 bc7cb1a1 2003-11-23 devnull sysfatal("fork: %r");
155 bc7cb1a1 2003-11-23 devnull
156 bc7cb1a1 2003-11-23 devnull case 0:
157 b4a659b6 2004-04-19 devnull exec("rc", arg);
158 bc7cb1a1 2003-11-23 devnull sysfatal("exec: %r");
159 bc7cb1a1 2003-11-23 devnull
160 bc7cb1a1 2003-11-23 devnull default:
161 bc7cb1a1 2003-11-23 devnull wpid = waitpid();
162 bc7cb1a1 2003-11-23 devnull if(wpid < 0)
163 bc7cb1a1 2003-11-23 devnull sysfatal("wait: %r");
164 bc7cb1a1 2003-11-23 devnull if(wpid != pid)
165 bc7cb1a1 2003-11-23 devnull sysfatal("wait got unexpected pid %d", wpid);
166 bc7cb1a1 2003-11-23 devnull }
167 bc7cb1a1 2003-11-23 devnull }
168 bc7cb1a1 2003-11-23 devnull
169 bc7cb1a1 2003-11-23 devnull void
170 bc7cb1a1 2003-11-23 devnull parse(char *s, int *pfrom1, int *pto1, int *pcmd, int *pfrom2, int *pto2)
171 bc7cb1a1 2003-11-23 devnull {
172 bc7cb1a1 2003-11-23 devnull *pfrom1 = *pto1 = *pfrom2 = *pto2 = 0;
173 bc7cb1a1 2003-11-23 devnull
174 bc7cb1a1 2003-11-23 devnull s = strchr(s, ':');
175 bc7cb1a1 2003-11-23 devnull if(s == nil)
176 bc7cb1a1 2003-11-23 devnull sysfatal("bad diff output0");
177 bc7cb1a1 2003-11-23 devnull s++;
178 bc7cb1a1 2003-11-23 devnull *pfrom1 = strtol(s, &s, 10);
179 bc7cb1a1 2003-11-23 devnull if(*s == ','){
180 bc7cb1a1 2003-11-23 devnull s++;
181 bc7cb1a1 2003-11-23 devnull *pto1 = strtol(s, &s, 10);
182 bc7cb1a1 2003-11-23 devnull }else
183 bc7cb1a1 2003-11-23 devnull *pto1 = *pfrom1;
184 bc7cb1a1 2003-11-23 devnull if(*s++ != ' ')
185 bc7cb1a1 2003-11-23 devnull sysfatal("bad diff output1");
186 bc7cb1a1 2003-11-23 devnull *pcmd = *s++;
187 bc7cb1a1 2003-11-23 devnull if(*s++ != ' ')
188 bc7cb1a1 2003-11-23 devnull sysfatal("bad diff output2");
189 bc7cb1a1 2003-11-23 devnull s = strchr(s, ':');
190 bc7cb1a1 2003-11-23 devnull if(s == nil)
191 bc7cb1a1 2003-11-23 devnull sysfatal("bad diff output3");
192 bc7cb1a1 2003-11-23 devnull s++;
193 bc7cb1a1 2003-11-23 devnull *pfrom2 = strtol(s, &s, 10);
194 bc7cb1a1 2003-11-23 devnull if(*s == ','){
195 bc7cb1a1 2003-11-23 devnull s++;
196 bc7cb1a1 2003-11-23 devnull *pto2 = strtol(s, &s, 10);
197 bc7cb1a1 2003-11-23 devnull }else
198 bc7cb1a1 2003-11-23 devnull *pto2 = *pfrom2;
199 bc7cb1a1 2003-11-23 devnull }
200 bc7cb1a1 2003-11-23 devnull
201 bc7cb1a1 2003-11-23 devnull void
202 bc7cb1a1 2003-11-23 devnull skiplines(Biobuf *b, char *name, int n)
203 bc7cb1a1 2003-11-23 devnull {
204 bc7cb1a1 2003-11-23 devnull int i;
205 bc7cb1a1 2003-11-23 devnull
206 bc7cb1a1 2003-11-23 devnull for(i=0; i<n; i++){
207 bc7cb1a1 2003-11-23 devnull while(Brdline(b, '\n')==nil){
208 bc7cb1a1 2003-11-23 devnull if(Blinelen(b) <= 0)
209 bc7cb1a1 2003-11-23 devnull sysfatal("early end of file on %s", name);
210 bc7cb1a1 2003-11-23 devnull Bseek(b, Blinelen(b), 1);
211 bc7cb1a1 2003-11-23 devnull }
212 bc7cb1a1 2003-11-23 devnull }
213 bc7cb1a1 2003-11-23 devnull }
214 bc7cb1a1 2003-11-23 devnull
215 bc7cb1a1 2003-11-23 devnull void
216 bc7cb1a1 2003-11-23 devnull copylines(Biobuf *bin, char *nin, Biobuf *bout, char *nout, int n)
217 bc7cb1a1 2003-11-23 devnull {
218 bc7cb1a1 2003-11-23 devnull char buf[4096], *p;
219 bc7cb1a1 2003-11-23 devnull int i, m;
220 bc7cb1a1 2003-11-23 devnull
221 bc7cb1a1 2003-11-23 devnull for(i=0; i<n; i++){
222 bc7cb1a1 2003-11-23 devnull while((p=Brdline(bin, '\n'))==nil){
223 bc7cb1a1 2003-11-23 devnull if(Blinelen(bin) <= 0)
224 bc7cb1a1 2003-11-23 devnull sysfatal("early end of file on %s", nin);
225 bc7cb1a1 2003-11-23 devnull m = Blinelen(bin);
226 bc7cb1a1 2003-11-23 devnull if(m > sizeof buf)
227 bc7cb1a1 2003-11-23 devnull m = sizeof buf;
228 bc7cb1a1 2003-11-23 devnull m = Bread(bin, buf, m);
229 bc7cb1a1 2003-11-23 devnull if(Bwrite(bout, buf, m) != m)
230 bc7cb1a1 2003-11-23 devnull sysfatal("error writing %s: %r", nout);
231 bc7cb1a1 2003-11-23 devnull }
232 bc7cb1a1 2003-11-23 devnull if(Bwrite(bout, p, Blinelen(bin)) != Blinelen(bin))
233 bc7cb1a1 2003-11-23 devnull sysfatal("error writing %s: %r", nout);
234 bc7cb1a1 2003-11-23 devnull }
235 bc7cb1a1 2003-11-23 devnull }
236 bc7cb1a1 2003-11-23 devnull
237 bc7cb1a1 2003-11-23 devnull void
238 bc7cb1a1 2003-11-23 devnull copy(Biobuf *bin, char *nin, Biobuf *bout, char *nout)
239 bc7cb1a1 2003-11-23 devnull {
240 bc7cb1a1 2003-11-23 devnull char buf[4096];
241 bc7cb1a1 2003-11-23 devnull int m;
242 bc7cb1a1 2003-11-23 devnull
243 bc7cb1a1 2003-11-23 devnull USED(nin);
244 bc7cb1a1 2003-11-23 devnull while((m = Bread(bin, buf, sizeof buf)) > 0)
245 bc7cb1a1 2003-11-23 devnull if(Bwrite(bout, buf, m) != m)
246 bc7cb1a1 2003-11-23 devnull sysfatal("error writing %s: %r", nout);
247 bc7cb1a1 2003-11-23 devnull }
248 bc7cb1a1 2003-11-23 devnull
249 bc7cb1a1 2003-11-23 devnull void
250 bc7cb1a1 2003-11-23 devnull idiff(Biobuf *b1, char *name1, Biobuf *b2, char *name2, Biobuf *bdiff, char *namediff, Biobuf *bout, char *nameout)
251 bc7cb1a1 2003-11-23 devnull {
252 bc7cb1a1 2003-11-23 devnull char buf[256], *p;
253 bc7cb1a1 2003-11-23 devnull int interactive, defaultanswer, cmd, diffoffset;
254 bc7cb1a1 2003-11-23 devnull int n, from1, to1, from2, to2, nf1, nf2;
255 bc7cb1a1 2003-11-23 devnull Biobuf berr;
256 bc7cb1a1 2003-11-23 devnull
257 bc7cb1a1 2003-11-23 devnull nf1 = 1;
258 bc7cb1a1 2003-11-23 devnull nf2 = 1;
259 bc7cb1a1 2003-11-23 devnull interactive = 1;
260 bc7cb1a1 2003-11-23 devnull defaultanswer = 0;
261 bc7cb1a1 2003-11-23 devnull Binit(&berr, 2, OWRITE);
262 bc7cb1a1 2003-11-23 devnull while(diffoffset = Boffset(bdiff), p = Brdline(bdiff, '\n')){
263 bc7cb1a1 2003-11-23 devnull p[Blinelen(bdiff)-1] = '\0';
264 bc7cb1a1 2003-11-23 devnull parse(p, &from1, &to1, &cmd, &from2, &to2);
265 bc7cb1a1 2003-11-23 devnull p[Blinelen(bdiff)-1] = '\n';
266 bc7cb1a1 2003-11-23 devnull n = to1-from1 + to2-from2 + 1; /* #lines from diff */
267 bc7cb1a1 2003-11-23 devnull if(cmd == 'c')
268 bc7cb1a1 2003-11-23 devnull n += 2;
269 bc7cb1a1 2003-11-23 devnull else if(cmd == 'a')
270 bc7cb1a1 2003-11-23 devnull from1++;
271 bc7cb1a1 2003-11-23 devnull else if(cmd == 'd')
272 bc7cb1a1 2003-11-23 devnull from2++;
273 bc7cb1a1 2003-11-23 devnull to1++; /* make half-open intervals */
274 bc7cb1a1 2003-11-23 devnull to2++;
275 bc7cb1a1 2003-11-23 devnull if(interactive){
276 bc7cb1a1 2003-11-23 devnull p[Blinelen(bdiff)-1] = '\0';
277 bc7cb1a1 2003-11-23 devnull fprint(2, "%s\n", p);
278 bc7cb1a1 2003-11-23 devnull p[Blinelen(bdiff)-1] = '\n';
279 bc7cb1a1 2003-11-23 devnull copylines(bdiff, namediff, &berr, "<stderr>", n);
280 bc7cb1a1 2003-11-23 devnull Bflush(&berr);
281 bc7cb1a1 2003-11-23 devnull }else
282 bc7cb1a1 2003-11-23 devnull skiplines(bdiff, namediff, n);
283 bc7cb1a1 2003-11-23 devnull do{
284 bc7cb1a1 2003-11-23 devnull if(interactive){
285 bc7cb1a1 2003-11-23 devnull fprint(2, "? ");
286 bc7cb1a1 2003-11-23 devnull memset(buf, 0, sizeof buf);
287 bc7cb1a1 2003-11-23 devnull if(read(0, buf, sizeof buf - 1) < 0)
288 bc7cb1a1 2003-11-23 devnull sysfatal("read console: %r");
289 bc7cb1a1 2003-11-23 devnull }else
290 bc7cb1a1 2003-11-23 devnull buf[0] = defaultanswer;
291 bc7cb1a1 2003-11-23 devnull
292 bc7cb1a1 2003-11-23 devnull switch(buf[0]){
293 bc7cb1a1 2003-11-23 devnull case '>':
294 bc7cb1a1 2003-11-23 devnull copylines(b1, name1, bout, nameout, from1-nf1);
295 bc7cb1a1 2003-11-23 devnull skiplines(b1, name1, to1-from1);
296 bc7cb1a1 2003-11-23 devnull skiplines(b2, name2, from2-nf2);
297 bc7cb1a1 2003-11-23 devnull copylines(b2, name2, bout, nameout, to2-from2);
298 bc7cb1a1 2003-11-23 devnull break;
299 bc7cb1a1 2003-11-23 devnull case '<':
300 bc7cb1a1 2003-11-23 devnull copylines(b1, name1, bout, nameout, to1-nf1);
301 bc7cb1a1 2003-11-23 devnull skiplines(b2, name2, to2-nf2);
302 bc7cb1a1 2003-11-23 devnull break;
303 bc7cb1a1 2003-11-23 devnull case '=':
304 bc7cb1a1 2003-11-23 devnull copylines(b1, name1, bout, nameout, from1-nf1);
305 bc7cb1a1 2003-11-23 devnull skiplines(b1, name1, to1-from1);
306 bc7cb1a1 2003-11-23 devnull skiplines(b2, name2, to2-nf2);
307 bc7cb1a1 2003-11-23 devnull if(Bseek(bdiff, diffoffset, 0) != diffoffset)
308 bc7cb1a1 2003-11-23 devnull sysfatal("seek in diff output: %r");
309 bc7cb1a1 2003-11-23 devnull copylines(bdiff, namediff, bout, nameout, n+1);
310 bc7cb1a1 2003-11-23 devnull break;
311 bc7cb1a1 2003-11-23 devnull case '!':
312 bc7cb1a1 2003-11-23 devnull runcmd(buf+1);
313 bc7cb1a1 2003-11-23 devnull break;
314 bc7cb1a1 2003-11-23 devnull case 'q':
315 bc7cb1a1 2003-11-23 devnull if(buf[1]=='<' || buf[1]=='>' || buf[1]=='='){
316 bc7cb1a1 2003-11-23 devnull interactive = 0;
317 bc7cb1a1 2003-11-23 devnull defaultanswer = buf[1];
318 bc7cb1a1 2003-11-23 devnull }else
319 bc7cb1a1 2003-11-23 devnull fprint(2, "must be q<, q>, or q=\n");
320 bc7cb1a1 2003-11-23 devnull break;
321 bc7cb1a1 2003-11-23 devnull default:
322 bc7cb1a1 2003-11-23 devnull fprint(2, "expect: <, >, =, q<, q>, q=, !cmd\n");
323 bc7cb1a1 2003-11-23 devnull break;
324 bc7cb1a1 2003-11-23 devnull }
325 bc7cb1a1 2003-11-23 devnull }while(buf[0] != '<' && buf[0] != '>' && buf[0] != '=');
326 bc7cb1a1 2003-11-23 devnull nf1 = to1;
327 bc7cb1a1 2003-11-23 devnull nf2 = to2;
328 bc7cb1a1 2003-11-23 devnull }
329 bc7cb1a1 2003-11-23 devnull copy(b1, name1, bout, nameout);
330 bc7cb1a1 2003-11-23 devnull }