Commit Diff


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<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
@@ -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; i<w->tag.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; 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);
@@ -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; 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);