Commit Diff


commit - 334cb1e91ceb2d667c1cfd0b71aa9801bef089ec
commit + 6d7fdb243ca2611e31648d57c8b3ac4101407cfa
blob - 14d17e2ca60c44ee9bde653be3893169e8ede329
blob + ee8bf1506fc176bf70bf8646f2dd2386c136b280
--- src/cmd/acme/acme.c
+++ src/cmd/acme/acme.c
@@ -113,6 +113,9 @@ threadmain(int argc, char *argv[])
 		exits("usage");
 	}ARGEND
 
+	fontnames[0] = estrdup(fontnames[0]);
+	fontnames[1] = estrdup(fontnames[1]);
+
 	quotefmtinstall();
 	cputype = getenv("cputype");
 	objtype = getenv("objtype");
@@ -218,9 +221,7 @@ threadmain(int argc, char *argv[])
 
 	#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 @@ rfget(int fix, int save, int setfont, char *name)
 		}
 		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 @@ rfget(int fix, int save, int setfont, char *name)
 		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;
blob - 48a57dd2ccb543b92a6eff51e3c6091694361a02
blob + 476bbfd1a3b5f533cabdc1aba49894e780ce7c60
--- src/cmd/acme/dat.h
+++ src/cmd/acme/dat.h
@@ -329,7 +329,7 @@ Text*	rowtype(Row*, Rune, Point);
 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
blob - c41985bb306b2784965bd7be6992aa17ccd0ae0d
blob + ccc7f58599c80fc3251a6e03891b8731294890d8
--- src/cmd/acme/edit.c
+++ src/cmd/acme/edit.c
@@ -445,6 +445,7 @@ collecttext(void)
 				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');
blob - 9fa5424821df3c0938d6a5411d42382f0f6f2fde
blob + 15e02894b5ff8d52031458be45ee6e7fa516c381
--- src/cmd/acme/rows.c
+++ src/cmd/acme/rows.c
@@ -476,14 +476,16 @@ rowloadfonts(char *file)
 		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 @@ rowload(Row *row, char *file, int initing)
 			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 @@ rowload(Row *row, char *file, int initing)
 			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 @@ rowload(Row *row, char *file, int initing)
 	}
 	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
blob - 8aac0ac0002d096132d53907008648dedfdff4e5
blob + 5f087f5d347772ee8d0302955c4c5ec03eb54bf2
--- src/cmd/acme/text.c
+++ src/cmd/acme/text.c
@@ -45,7 +45,7 @@ textredraw(Text *t, Rectangle r, Font *f, Image *b, in
 
 	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 @@ textload(Text *t, uint q0, char *file, int setqid)
 
 	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 @@ texttype(Text *t, Rune r)
 	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;
blob - 4fa3fec003e518ee5b500fe8684b5e7d5e05a2ff
blob + f9387df5e29dc1e7eb896347b95f67fc7e262e98
--- src/cmd/acme/util.c
+++ src/cmd/acme/util.c
@@ -83,7 +83,7 @@ errorwin1(Rune *dir, int ndir, Rune **incl, int nincl)
 	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'/';
 	}