diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c index 14d17e2c..ee8bf150 100644 --- a/src/cmd/acme/acme.c +++ b/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; diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h index 48a57dd2..476bbfd1 100644 --- a/src/cmd/acme/dat.h +++ b/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 diff --git a/src/cmd/acme/edit.c b/src/cmd/acme/edit.c index c41985bb..ccc7f585 100644 --- a/src/cmd/acme/edit.c +++ b/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'); diff --git a/src/cmd/acme/rows.c b/src/cmd/acme/rows.c index 9fa54248..15e02894 100644 --- a/src/cmd/acme/rows.c +++ b/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 diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c index 8aac0ac0..5f087f5d 100644 --- a/src/cmd/acme/text.c +++ b/src/cmd/acme/text.c @@ -45,7 +45,7 @@ textredraw(Text *t, Rectangle r, Font *f, Image *b, int odx) 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; diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c index 4fa3fec0..f9387df5 100644 --- a/src/cmd/acme/util.c +++ b/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'/'; }