commit - 3a62e5630748d788166a50ed34b7f0dc6d43a5ee
commit + 81d992e35f12d53e6799d20c744ffb4e6a49787d
blob - 8dc023781d70a5e42e4c5e671b674a586c0ae10e
blob + fece1dbdc75b0f112e804789619b1768f006981c
--- src/cmd/acme/fns.h
+++ src/cmd/acme/fns.h
void startplumbing(void);
long nlcount(Text*, long, long, long*);
long nlcounttopos(Text*, long, long, long);
+Rune* parsetag(Window*, int*);
Runestr runestr(Rune*, uint);
Range range(int, int);
blob - 44e23ccacb63091a16d46e9230c5ffae32df2f35
blob + 7b70e24237b27e42eb35f951a7a94d7c0ab7c500
--- src/cmd/acme/look.c
+++ src/cmd/acme/look.c
Runestr
dirname(Text *t, Rune *r, int n)
{
- Rune *b, c;
- uint m, nt;
- int slash;
+ Rune *b;
+ uint nt;
+ int slash, i;
Runestr tmp;
b = nil;
goto Rescue;
if(n>=1 && r[0]=='/')
goto Rescue;
- b = runemalloc(nt+n+1);
- bufread(&t->w->tag.file->b, 0, b, nt);
+ b = parsetag(t->w, &i);
slash = -1;
- for(m=0; m<nt; m++){
- c = b[m];
- if(c == '/')
- slash = m;
- if(c==' ' || c=='\t')
+ for(i--; i >= 0; i--){
+ if(b[i] == '/'){
+ slash = i;
break;
+ }
}
if(slash < 0)
goto Rescue;
blob - 820955b0b62c63f20ffa1e4fa56d0510c07f6f8e
blob + 5950ef0e9e6d3a3908b550b02fbc8ec5942152ff
--- src/cmd/acme/wind.c
+++ src/cmd/acme/wind.c
if(w->tag.q1 > i)
w->tag.q1 = i;
textsetselect(&w->tag, w->tag.q0, w->tag.q1);
+}
+
+Rune*
+parsetag(Window *w, int *len)
+{
+ int i;
+ Rune *r;
+
+ r = runemalloc(w->tag.file->b.nc+1);
+ bufread(&w->tag.file->b, 0, r, w->tag.file->b.nc);
+ r[w->tag.file->b.nc] = '\0';
+
+ for(i=0; i<w->tag.file->b.nc; i++)
+ if(r[i]==' ' || r[i]=='\t')
+ break;
+ *len = i;
+ return r;
}
void
/* there are races that get us here with stuff in the tag cache, so we take extra care to sync it */
if(w->tag.ncache!=0 || w->tag.file->mod)
wincommit(w, &w->tag); /* check file name; also guarantees we can modify tag contents */
- old = runemalloc(w->tag.file->b.nc+1);
- bufread(&w->tag.file->b, 0, old, w->tag.file->b.nc);
- old[w->tag.file->b.nc] = '\0';
- for(i=0; i<w->tag.file->b.nc; i++)
- if(old[i]==' ' || old[i]=='\t')
- break;
+ old = parsetag(w, &i);
if(runeeq(old, i, w->body.file->name, w->body.file->nname) == FALSE){
textdelete(&w->tag, 0, i, TRUE);
textinsert(&w->tag, 0, w->body.file->name, w->body.file->nname, TRUE);
textcommit(f->text[i], FALSE); /* no-op for t */
if(t->what == Body)
return;
- r = runemalloc(w->tag.file->b.nc);
- bufread(&w->tag.file->b, 0, r, w->tag.file->b.nc);
- for(i=0; i<w->tag.file->b.nc; i++)
- if(r[i]==' ' || r[i]=='\t')
- break;
+ r = parsetag(w, &i);
if(runeeq(r, i, w->body.file->name, w->body.file->nname) == FALSE){
seq++;
filemark(w->body.file);