diff options
author | rsc <devnull@localhost> | 2004-04-19 05:56:17 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-19 05:56:17 +0000 |
commit | e543c475e7ac135ce1497d7a0d339eacf8f6cfe1 (patch) | |
tree | 86706812a12badffa87dddfbe514860f785a3958 /src/libdraw/devdraw.c | |
parent | 904f0d0b4210ce81304c6cebfb562d9bb67bdfbe (diff) | |
download | plan9port-e543c475e7ac135ce1497d7a0d339eacf8f6cfe1.tar.gz plan9port-e543c475e7ac135ce1497d7a0d339eacf8f6cfe1.tar.bz2 plan9port-e543c475e7ac135ce1497d7a0d339eacf8f6cfe1.zip |
fix drawread, add changes from david tolpin
Diffstat (limited to 'src/libdraw/devdraw.c')
-rw-r--r-- | src/libdraw/devdraw.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c index 76b79684..4f35cd19 100644 --- a/src/libdraw/devdraw.c +++ b/src/libdraw/devdraw.c @@ -744,31 +744,28 @@ drawcoord(uchar *p, uchar *maxp, int oldx, int *newx) int _drawmsgread(Display *d, void *a, int n) { - int inbuf; + Client *cl; qlock(&sdraw.lk); - inbuf = d->obufp - d->obuf; - if(n > inbuf) - n = inbuf; - memmove(a, d->obuf, n); - inbuf -= n; - if(inbuf) - memmove(d->obuf, d->obufp-inbuf, inbuf); - d->obufp = d->obuf+inbuf; + cl = client0; + if(cl->readdata == nil){ + werrstr("no draw data"); + goto err; + } + if(n < cl->nreaddata){ + werrstr("short read"); + goto err; + } + n = cl->nreaddata; + memmove(a, cl->readdata, cl->nreaddata); + free(cl->readdata); + cl->readdata = nil; qunlock(&sdraw.lk); return n; -} - -static void -drawmsgsquirrel(Display *d, void *a, int n) -{ - uchar *ep; - ep = d->obuf + d->obufsize; - if(d->obufp + n > ep) - abort(); - memmove(d->obufp, a, n); - d->obufp += n; +err: + qunlock(&sdraw.lk); + return -1; } int @@ -1086,7 +1083,12 @@ _drawmsgwrite(Display *d, void *v, int n) i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y, i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, i->clipr.max.y); - drawmsgsquirrel(d, ibuf, ni); + free(client->readdata); + client->readdata = malloc(ni); + if(client->readdata == nil) + goto Enomem; + memmove(client->readdata, ibuf, ni); + client->nreaddata = ni; client->infoid = -1; continue; |