From 8ad517944e46710ab832350c0dc3fc4e9239f7e2 Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 25 Mar 2004 23:03:57 +0000 Subject: Today's changes. More changes. --- src/cmd/acme/acme.c | 24 +++++++++++++----------- src/cmd/acme/dat.h | 1 + src/cmd/acme/ecmd.c | 2 +- src/cmd/acme/exec.c | 4 +++- src/cmd/acme/fns.h | 5 ++++- src/cmd/acme/fsys.c | 44 ++++++++++++++++++++++++++++---------------- src/cmd/acme/look.c | 12 ++++++------ src/cmd/acme/text.c | 2 +- src/cmd/acme/util.c | 23 ++++++++++++++++++----- src/cmd/acme/xfid.c | 3 --- 10 files changed, 75 insertions(+), 45 deletions(-) (limited to 'src/cmd/acme') diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c index d4b4cad8..9636beab 100644 --- a/src/cmd/acme/acme.c +++ b/src/cmd/acme/acme.c @@ -161,7 +161,8 @@ threadmain(int argc, char *argv[]) cerr = chancreate(sizeof(char*), 0); cedit = chancreate(sizeof(int), 0); cexit = chancreate(sizeof(int), 0); - if(cwait==nil || ccommand==nil || ckill==nil || cxfidalloc==nil || cxfidfree==nil || cerr==nil || cexit==nil){ + cwarn = chancreate(sizeof(void*), 1); + if(cwait==nil || ccommand==nil || ckill==nil || cxfidalloc==nil || cxfidfree==nil || cerr==nil || cexit==nil || cwarn==nil){ fprint(2, "acme: can't create initial channels: %r\n"); exits("channels"); } @@ -251,7 +252,7 @@ readfile(Column *c, char *s) w = coladd(c, nil, nil, -1); cvttorunes(s, strlen(s), rb, &nb, &nr, nil); - rs = cleanrname((Runestr){rb, nr}); + rs = cleanrname(runestr(rb, nr)); winsetname(w, rs.r, rs.nr); textload(&w->body, 0, s, 1); w->body.file->mod = FALSE; @@ -403,7 +404,6 @@ keyboardthread(void *v) winlock(t->w, 'K'); wincommit(t->w, t); winunlock(t->w); - flushwarnings(1); flushimage(display, 1); } alts[KTimer].c = nil; @@ -430,7 +430,6 @@ keyboardthread(void *v) } if(nbrecv(keyboardctl->c, &r) > 0) goto casekeyboard; - flushwarnings(1); flushimage(display, 1); break; } @@ -447,7 +446,7 @@ mousethread(void *v) Plumbmsg *pm; Mouse m; char *act; - enum { MResize, MMouse, MPlumb, NMALT }; + enum { MResize, MMouse, MPlumb, MWarnings, NMALT }; static Alt alts[NMALT+1]; USED(v); @@ -461,11 +460,18 @@ mousethread(void *v) alts[MPlumb].c = cplumb; alts[MPlumb].v = ± alts[MPlumb].op = CHANRCV; + alts[MWarnings].c = cwarn; + alts[MWarnings].v = nil; + alts[MWarnings].op = CHANRCV; if(cplumb == nil) alts[MPlumb].op = CHANNOP; alts[NMALT].op = CHANEND; for(;;){ + qlock(&row.lk); + flushwarnings(); + qunlock(&row.lk); + flushimage(display, 1); switch(alt(alts)){ case MResize: if(getwindow(display, Refnone) < 0) @@ -473,8 +479,6 @@ mousethread(void *v) draw(screen, screen->r, display->white, nil, ZP); scrlresize(); rowresize(&row, screen->clipr); - flushwarnings(1); - flushimage(display, 1); break; case MPlumb: if(strcmp(pm->type, "text") == 0){ @@ -484,10 +488,10 @@ mousethread(void *v) else if(strcmp(act, "showdata")==0) plumbshow(pm); } - flushwarnings(1); - flushimage(display, 1); plumbfree(pm); break; + case MWarnings: + break; case MMouse: /* * Make a copy so decisions are consistent; mousectl changes @@ -570,8 +574,6 @@ mousethread(void *v) goto Continue; } Continue: - flushwarnings(0); - flushimage(display, 1); qunlock(&row.lk); break; } diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h index 94cfa383..338a1ff8 100644 --- a/src/cmd/acme/dat.h +++ b/src/cmd/acme/dat.h @@ -543,5 +543,6 @@ Channel *mouseexit1; /* chan(int) */ Channel *cexit; /* chan(int) */ Channel *cerr; /* chan(char*) */ Channel *cedit; /* chan(int) */ +Channel *cwarn; /* chan(void*)[1] (really chan(unit)[1]) */ #define STACK 32768 diff --git a/src/cmd/acme/ecmd.c b/src/cmd/acme/ecmd.c index 0dfae90a..7ccb9427 100644 --- a/src/cmd/acme/ecmd.c +++ b/src/cmd/acme/ecmd.c @@ -268,7 +268,7 @@ D_cmd(Text *t, Cmd *cp) runemove(n, dir.r, dir.nr); n[dir.nr] = '/'; runemove(n+dir.nr+1, r, nn); - rs = cleanrname((Runestr){n, dir.nr+1+nn}); + rs = cleanrname(runestr(n, dir.nr+1+nn)); } w = lookfile(rs.r, rs.nr); if(w == nil){ diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c index 74f9f47c..0e3389d6 100644 --- a/src/cmd/acme/exec.c +++ b/src/cmd/acme/exec.c @@ -25,6 +25,7 @@ void fontx(Text*, Text*, Text*, int, int, Rune*, int); void get(Text*, Text*, Text*, int, int, Rune*, int); void id(Text*, Text*, Text*, int, int, Rune*, int); void incl(Text*, Text*, Text*, int, int, Rune*, int); +void indent(Text*, Text*, Text*, int, int, Rune*, int); void xkill(Text*, Text*, Text*, int, int, Rune*, int); void local(Text*, Text*, Text*, int, int, Rune*, int); void look(Text*, Text*, Text*, int, int, Rune*, int); @@ -58,6 +59,7 @@ static Rune LFont[] = { 'F', 'o', 'n', 't', 0 }; static Rune LGet[] = { 'G', 'e', 't', 0 }; static Rune LID[] = { 'I', 'D', 0 }; static Rune LIncl[] = { 'I', 'n', 'c', 'l', 0 }; +static Rune LIndent[] = { 'I', 'n', 'd', 'e', 'n', 't', 0 }; static Rune LKill[] = { 'K', 'i', 'l', 'l', 0 }; static Rune LLoad[] = { 'L', 'o', 'a', 'd', 0 }; static Rune LLocal[] = { 'L', 'o', 'c', 'a', 'l', 0 }; @@ -87,6 +89,7 @@ Exectab exectab[] = { { LGet, get, FALSE, TRUE, XXX }, { LID, id, FALSE, XXX, XXX }, { LIncl, incl, FALSE, XXX, XXX }, + { LIndent, indent, FALSE, XXX, XXX }, { LKill, xkill, FALSE, XXX, XXX }, { LLoad, dump, FALSE, FALSE, XXX }, { LLocal, local, FALSE, XXX, XXX }, @@ -1443,7 +1446,6 @@ runproc(void *argvp) goto Fail; Hard: - /* * ugly: set path = (. $cputype /bin) * should honor $path if unusual. diff --git a/src/cmd/acme/fns.h b/src/cmd/acme/fns.h index 9fba7d7a..c164bb3b 100644 --- a/src/cmd/acme/fns.h +++ b/src/cmd/acme/fns.h @@ -69,6 +69,7 @@ Rune* bytetorune(char*, int*); void fsysinit(void); Mntdir* fsysmount(Rune*, int, Rune**, int); void fsysdelid(Mntdir*); +void fsysincid(Mntdir*); Xfid* respond(Xfid*, Fcall*, char*); int rxcompile(Rune*); int rgetc(void*, uint); @@ -86,9 +87,11 @@ int expand(Text*, uint, uint, Expand*); Rune* skipbl(Rune*, int, int*); Rune* findbl(Rune*, int, int*); char* edittext(Window*, int, Rune*, int); -void flushwarnings(int); +void flushwarnings(void); void startplumbing(void); +Runestr runestr(Rune*, uint); + #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune)) #define runerealloc(a, b) (Rune*)erealloc((a), (b)*sizeof(Rune)) #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune)) diff --git a/src/cmd/acme/fsys.c b/src/cmd/acme/fsys.c index f178f864..af4255c8 100644 --- a/src/cmd/acme/fsys.c +++ b/src/cmd/acme/fsys.c @@ -37,22 +37,25 @@ static Xfid* fsysremove(Xfid*, Fid*); static Xfid* fsysstat(Xfid*, Fid*); static Xfid* fsyswstat(Xfid*, Fid*); -Xfid* (*fcall[Tmax])(Xfid*, Fid*) = +Xfid* (*fcall[Tmax])(Xfid*, Fid*); + +static void +initfcall(void) { - [Tflush] = fsysflush, - [Tversion] = fsysversion, - [Tauth] = fsysauth, - [Tattach] = fsysattach, - [Twalk] = fsyswalk, - [Topen] = fsysopen, - [Tcreate] = fsyscreate, - [Tread] = fsysread, - [Twrite] = fsyswrite, - [Tclunk] = fsysclunk, - [Tremove]= fsysremove, - [Tstat] = fsysstat, - [Twstat] = fsyswstat, -}; + fcall[Tflush] = fsysflush; + fcall[Tversion] = fsysversion; + fcall[Tauth] = fsysauth; + fcall[Tattach] = fsysattach; + fcall[Twalk] = fsyswalk; + fcall[Topen] = fsysopen; + fcall[Tcreate] = fsyscreate; + fcall[Tread] = fsysread; + fcall[Twrite] = fsyswrite; + fcall[Tclunk] = fsysclunk; + fcall[Tremove]= fsysremove; + fcall[Tstat] = fsysstat; + fcall[Twstat] = fsyswstat; +} char Eperm[] = "permission denied"; char Eexist[] = "file does not exist"; @@ -113,6 +116,7 @@ fsysinit(void) int p[2]; char *u; + initfcall(); if(pipe(p) < 0) error("can't create pipe"); if(post9pservice(p[0], "acme") < 0) @@ -186,6 +190,14 @@ fsysaddid(Rune *dir, int ndir, Rune **incl, int nincl) return m; } +void +fsysincid(Mntdir *m) +{ + qlock(&mnt.lk); + m->ref++; + qunlock(&mnt.lk); +} + void fsysdelid(Mntdir *idm) { @@ -331,7 +343,7 @@ fsysattach(Xfid *x, Fid *f) m->ref++; break; } - if(m == nil){ + if(m == nil && x->fcall.aname[0]){ snprint(buf, sizeof buf, "unknown id '%s' in attach", x->fcall.aname); sendp(cerr, estrdup(buf)); } diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c index f6c4d4ee..70233826 100644 --- a/src/cmd/acme/look.c +++ b/src/cmd/acme/look.c @@ -259,7 +259,7 @@ plumbshow(Plumbmsg *m) } cvttorunes(name, strlen(name), rb, &nb, &nr, nil); free(p); - rs = cleanrname((Runestr){rb, nr}); + rs = cleanrname(runestr(rb, nr)); winsetname(w, rs.r, rs.nr); r = runemalloc(m->ndata); cvttorunes(m->data, m->ndata, r, &nb, &nr, nil); @@ -385,13 +385,13 @@ includefile(Rune *dir, Rune *file, int nfile) n = access(a, 0); free(a); if(n < 0) - return (Runestr){nil, 0}; + return runestr(nil, 0); r = runemalloc(m+1+nfile); runemove(r, dir, m); runemove(r+m, Lslash, 1); runemove(r+m+1, file, nfile); free(file); - return cleanrname((Runestr){r, m+1+nfile}); + return cleanrname(runestr(r, m+1+nfile)); } static Rune *objdir; @@ -442,7 +442,7 @@ includename(Text *t, Rune *r, int n) return file; Rescue: - return (Runestr){r, n}; + return runestr(r, n); } Runestr @@ -475,11 +475,11 @@ dirname(Text *t, Rune *r, int n) goto Rescue; runemove(b+slash+1, r, n); free(r); - return cleanrname((Runestr){b, slash+1+n}); + return cleanrname(runestr(b, slash+1+n)); Rescue: free(b); - tmp = (Runestr){r, n}; + tmp = runestr(r, n); if(r) return cleanrname(tmp); return tmp; diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c index 8bdf0b78..c0cd7ec1 100644 --- a/src/cmd/acme/text.c +++ b/src/cmd/acme/text.c @@ -578,7 +578,7 @@ textcomplete(Text *t) path[i] = textreadc(t, q++); /* is path rooted? if not, we need to make it relative to window path */ if(npath>0 && path[0]=='/') - dir = (Runestr){path, npath}; + dir = runestr(path, npath); else{ dir = dirname(t, nil, 0); if(dir.nr + 1 + npath > nelem(tmp)){ diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c index de71107a..a7307e06 100644 --- a/src/cmd/acme/util.c +++ b/src/cmd/acme/util.c @@ -14,6 +14,16 @@ static Point prevmouse; static Window *mousew; +Runestr +runestr(Rune *r, uint n) +{ + Runestr rs; + + rs.r = r; + rs.nr = n; + return rs; +} + void cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls) { @@ -133,12 +143,17 @@ addwarningtext(Mntdir *md, Rune *r, int nr) } warn = emalloc(sizeof(Warning)); warn->next = warnings; + warn->md = md; + if(md) + fsysincid(md); warnings = warn; bufinsert(&warn->buf, 0, r, nr); + nbsendp(cwarn, 0); } +/* called while row is locked */ void -flushwarnings(int dolock) +flushwarnings(void) { Warning *warn, *next; Window *w; @@ -146,8 +161,6 @@ flushwarnings(int dolock) int owner, nr, q0, n; Rune *r; - if(dolock) - qlock(&row.lk); if(row.ncol == 0){ /* really early error */ rowinit(&row, screen->clipr); rowadd(&row, nil, -1); @@ -189,11 +202,11 @@ flushwarnings(int dolock) winunlock(w); bufclose(&warn->buf); next = warn->next; + if(warn->md) + fsysdelid(warn->md); free(warn); } warnings = nil; - if(dolock) - qunlock(&row.lk); } void diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c index b3bef2cd..839308ee 100644 --- a/src/cmd/acme/xfid.c +++ b/src/cmd/acme/xfid.c @@ -543,7 +543,6 @@ xfidwrite(Xfid *x) } if(w) winunlock(w); - flushwarnings(1); } void @@ -814,7 +813,6 @@ xfideventwrite(Xfid *x, Window *w) qunlock(&row.lk); goto Rescue; } - flushwarnings(0); qunlock(&row.lk); } @@ -1032,7 +1030,6 @@ xfidindexread(Xfid *x) b[n++] = '\n'; } } - flushwarnings(0); qunlock(&row.lk); off = x->fcall.offset; cnt = x->fcall.count; -- cgit v1.2.3