changes from plan 9
diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c
index 14d17e2..ee8bf15 100644
--- a/src/cmd/acme/acme.c
+++ b/src/cmd/acme/acme.c
@@ -113,6 +113,9 @@
 		exits("usage");
 	}ARGEND
 
+	fontnames[0] = estrdup(fontnames[0]);
+	fontnames[1] = estrdup(fontnames[1]);
+
 	quotefmtinstall();
 	cputype = getenv("cputype");
 	objtype = getenv("objtype");
@@ -218,9 +221,7 @@
 
 	#define	WPERCOL	8
 	disk = diskinit();
-	if(loadfile)
-		rowload(&row, loadfile, TRUE);
-	else{
+	if(!loadfile || !rowload(&row, loadfile, TRUE)){
 		rowinit(&row, screen->clipr);
 		if(ncol < 0){
 			if(argc == 0)
@@ -859,7 +860,7 @@
 		}
 		r = emalloc(sizeof(Reffont));
 		r->f = f;
-		fontcache = realloc(fontcache, (nfontcache+1)*sizeof(Reffont*));
+		fontcache = erealloc(fontcache, (nfontcache+1)*sizeof(Reffont*));
 		fontcache[nfontcache++] = r;
 	}
     Found:
@@ -868,8 +869,10 @@
 		if(reffonts[fix])
 			rfclose(reffonts[fix]);
 		reffonts[fix] = r;
-		free(fontnames[fix]);
-		fontnames[fix] = name;
+		if(fontnames[fix] != name){
+			free(fontnames[fix]);
+			fontnames[fix] = estrdup(name);
+		}
 	}
 	if(setfont){
 		reffont.f = r->f;
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index 48a57dd..476bbfd 100644
--- a/src/cmd/acme/dat.h
+++ b/src/cmd/acme/dat.h
@@ -329,7 +329,7 @@
 void		rowdragcol(Row*, Column*, int but);
 int		rowclean(Row*);
 void		rowdump(Row*, char*);
-void		rowload(Row*, char*, int);
+int		rowload(Row*, char*, int);
 void		rowloadfonts(char*);
 
 struct Timer
diff --git a/src/cmd/acme/edit.c b/src/cmd/acme/edit.c
index c41985b..ccc7f58 100644
--- a/src/cmd/acme/edit.c
+++ b/src/cmd/acme/edit.c
@@ -445,6 +445,7 @@
 				goto Return;
 		}while(s->r[begline]!='.' || s->r[begline+1]!='\n');
 		s->r[s->n-2] = '\0';
+		s->n -= 2;
 	}else{
 		okdelim(delim = getch());
 		getrhs(s, delim, 'a');
diff --git a/src/cmd/acme/rows.c b/src/cmd/acme/rows.c
index 9fa5424..15e0289 100644
--- a/src/cmd/acme/rows.c
+++ b/src/cmd/acme/rows.c
@@ -476,14 +476,16 @@
 		if(l == nil)
 			goto Return;
 		l[Blinelen(b)-1] = 0;
-		if(*l && strcmp(l, fontnames[i])!=0)
+		if(*l && strcmp(l, fontnames[i])!=0){
+			free(fontnames[i]);
 			fontnames[i] = estrdup(l);
+		}
 	}
     Return:
 	Bterm(b);
 }
 
-void
+int
 rowload(Row *row, char *file, int initing)
 {
 	int i, j, line, percent, y, nr, nfontr, n, ns, ndumped, dumpid, x, fd;
@@ -526,7 +528,7 @@
 			goto Rescue2;
 		l[Blinelen(b)-1] = 0;
 		if(*l && strcmp(l, fontnames[i])!=0)
-			rfget(i, TRUE, i==0 && initing, estrdup(l));
+			rfget(i, TRUE, i==0 && initing, l);
 	}
 	if(initing && row->ncol==0)
 		rowinit(row, screen->clipr);
@@ -697,11 +699,11 @@
 			winsettag(w);
 		}else if(dumpid==0 && r[ns+1]!='+' && r[ns+1]!='-')
 			get(&w->body, nil, nil, FALSE, XXX, nil, 0);
-		free(r);
 		if(fontr){
 			fontx(&w->body, nil, nil, 0, 0, fontr, nfontr);
 			free(fontr);
 		}
+		free(r);
 		if(q0>w->body.file->b.nc || q1>w->body.file->b.nc || q0>q1)
 			q0 = q1 = 0;
 		textshow(&w->body, q0, q1, 1);
@@ -709,14 +711,15 @@
 	}
 	Bterm(b);
 
-Rescue1:
 	fbuffree(buf);
-	return;
+	return TRUE;
 
 Rescue2:
 	warning(nil, "bad load file %s:%d\n", file, line);
 	Bterm(b);
-	goto Rescue1;
+Rescue1:
+	fbuffree(buf);
+	return FALSE;
 }
 
 void
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index 8aac0ac..5f087f5 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -45,7 +45,7 @@
 
 	frinit(&t->fr, r, f, b, t->fr.cols);
 	rr = t->fr.r;
-	rr.min.x -= Scrollwid;	/* back fill to scroll bar */
+	rr.min.x -= Scrollwid+Scrollgap;	/* back fill to scroll bar */
 	draw(t->fr.b, rr, t->fr.cols[BACK], nil, ZP);
 	/* use no wider than 3-space tabs in a directory */
 	maxt = maxtab;
@@ -193,6 +193,10 @@
 
 	if(t->ncache!=0 || t->file->b.nc || t->w==nil || t!=&t->w->body || (t->w->isdir && t->file->nname==0))
 		error("text.load");
+	if(t->w->isdir && t->file.nname==0){
+		warning(nil, "empty directory name");
+		return 0;
+	}
 	fd = open(file, OREAD);
 	if(fd < 0){
 		warning(nil, "can't open %s: %r\n", file);
@@ -645,7 +649,10 @@
 	switch(r){
 	case Kleft:
 		if(t->q0 > 0){
-			wincommit(t->w, t);
+			if(t->w)
+				wincommit(t->w, t);
+			else
+				textcommit(t->w, TRUE);
 			textshow(t, t->q0-1, t->q0-1, TRUE);
 		}
 		return;
diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c
index 4fa3fec..f9387df 100644
--- a/src/cmd/acme/util.c
+++ b/src/cmd/acme/util.c
@@ -83,7 +83,7 @@
 	static Rune Lpluserrors[] = { '+', 'E', 'r', 'r', 'o', 'r', 's', 0 };
 
 	r = runemalloc(ndir+8);
-	if(n = ndir){	/* assign = */
+	if((n = ndir) != 0){
 		runemove(r, dir, ndir);
 		r[n++] = L'/';
 	}