summaryrefslogtreecommitdiffstats
path: root/src/cmd/acme/util.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-30 16:34:12 +0000
committerrsc <devnull@localhost>2005-01-30 16:34:12 +0000
commit9d01e221783e7706fd1d3dadfc8a7f678004929c (patch)
treeab3ca9688a6b41f27d40d65d431048edd65fd25d /src/cmd/acme/util.c
parent3fef2ed0565e831549b43153751c81e9ee2e7e86 (diff)
downloadplan9port-9d01e221783e7706fd1d3dadfc8a7f678004929c.tar.gz
plan9port-9d01e221783e7706fd1d3dadfc8a7f678004929c.zip
add errors file
Diffstat (limited to 'src/cmd/acme/util.c')
-rw-r--r--src/cmd/acme/util.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c
index f9387df5..c224cce5 100644
--- a/src/cmd/acme/util.c
+++ b/src/cmd/acme/util.c
@@ -129,6 +129,49 @@ errorwin(Mntdir *md, int owner)
return w;
}
+/*
+ * Incoming window should be locked.
+ * It will be unlocked and returned window
+ * will be locked in its place.
+ */
+Window*
+errorwinforwin(Window *w)
+{
+ int i, n, nincl, owner;
+ Rune **incl;
+ Runestr dir;
+ Text *t;
+
+ t = &w->body;
+ dir = dirname(t, nil, 0);
+ if(dir.nr==1 && dir.r[0]=='.'){ /* sigh */
+ free(dir.r);
+ dir.r = nil;
+ dir.nr = 0;
+ }
+ incl = nil;
+ nincl = w->nincl;
+ if(nincl > 0){
+ incl = emalloc(nincl*sizeof(Rune*));
+ for(i=0; i<nincl; i++){
+ n = runestrlen(w->incl[i]);
+ incl[i] = runemalloc(n+1);
+ runemove(incl[i], w->incl[i], n);
+ }
+ }
+ owner = w->owner;
+ winunlock(w);
+ for(;;){
+ w = errorwin1(dir.r, dir.nr, incl, nincl);
+ winlock(w, owner);
+ if(w->col != nil)
+ break;
+ /* window deleted too fast */
+ winunlock(w);
+ }
+ return w;
+}
+
typedef struct Warning Warning;
struct Warning{