commit 81d992e35f12d53e6799d20c744ffb4e6a49787d from: Russ Cox date: Tue Jan 14 02:43:54 2020 UTC acme: factor out tag parsing code commit - 3a62e5630748d788166a50ed34b7f0dc6d43a5ee commit + 81d992e35f12d53e6799d20c744ffb4e6a49787d blob - 8dc023781d70a5e42e4c5e671b674a586c0ae10e blob + fece1dbdc75b0f112e804789619b1768f006981c --- src/cmd/acme/fns.h +++ src/cmd/acme/fns.h @@ -95,6 +95,7 @@ void flushwarnings(void); 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 @@ -477,9 +477,9 @@ includename(Text *t, Rune *r, int n) 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; @@ -490,15 +490,13 @@ dirname(Text *t, Rune *r, int n) 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= 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 @@ -438,6 +438,23 @@ wincleartag(Window *w) 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; itag.file->b.nc; i++) + if(r[i]==' ' || r[i]=='\t') + break; + *len = i; + return r; } void @@ -458,12 +475,7 @@ winsettag1(Window *w) /* 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; itag.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); @@ -584,11 +596,7 @@ wincommit(Window *w, Text *t) 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; itag.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);