9 File *matchfile(String*);
10 Address charaddr(Posn, Address, int);
13 address(Addr *ap, Address a, int sign)
22 a = (*(ap->type=='#'?charaddr:lineaddr))(ap->num, a, sign);
30 a.r.p1 = a.r.p2 = f->nc;
43 nextmatch(f, ap->are, sign>=0? a.r.p2 : a.r.p1, sign);
48 a = matchfile(ap->are)->dot;
55 a.r.p1 = 0, a.r.p2 = f->nc;
61 a1 = address(ap->left, a, 0);
63 a1.f = a.f, a1.r.p1 = a1.r.p2 = 0;
70 a2 = address(ap->next, a, 0);
72 a2.f = a.f, a2.r.p1 = a2.r.p2 = f->nc;
75 a.f = a1.f, a.r.p1 = a1.r.p1, a.r.p2 = a2.r.p2;
85 if(ap->next==0 || ap->next->type=='+' || ap->next->type=='-')
86 a = lineaddr(1L, a, sign);
92 }while(ap = ap->next); /* assign = */
97 nextmatch(File *f, String *r, Posn p, int sign)
101 if(!execute(f, p, INFINITY))
103 if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p1==p){
106 if(!execute(f, p, INFINITY))
112 if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p2==p){
128 for(i = 0; i<file.nused; i++){
129 f = file.filepptr[i];
144 filematch(File *f, String *r)
146 char *c, buf[STRSIZE+100];
149 c = Strtoc(&f->name);
150 sprint(buf, "%c%c%c %s\n", " '"[f->mod],
151 "-+"[f->rasp!=0], " ."[f==curfile], c);
154 Strduplstr(&genstr, t);
156 /* A little dirty... */
160 bufinsert(menu, 0, genstr.s, genstr.n);
162 return execute(menu, 0, menu->nc);
166 charaddr(Posn l, Address addr, int sign)
169 addr.r.p1 = addr.r.p2 = l;
171 addr.r.p2 = addr.r.p1-=l;
173 addr.r.p1 = addr.r.p2+=l;
174 if(addr.r.p1<0 || addr.r.p2>addr.f->nc)
180 lineaddr(Posn l, Address addr, int sign)
191 if(sign==0 || addr.r.p2==0){
198 if(sign==0 || addr.r.p2==0){
203 n = filereadc(f, p++)=='\n';
208 if(filereadc(f, p++) == '\n')
213 while(p < f->nc && filereadc(f, p++)!='\n')
221 for(n = 0; n<l; ){ /* always runs once */
226 c = filereadc(f, p-1);
227 if(c != '\n' || ++n != l)
235 while(p > 0 && filereadc(f, p-1)!='\n') /* lines start after a newline */