commit - ad2922ef28f026b8bbd0aee30d92f703613c1486
commit + 78439d25f8b2f6f2289e9f4e4400e0f7cdb5fa70
blob - 875a26c70201ccad53989624860ab5fe0ffffaeb
blob + c0771e058c6e10e319490c69d313147aa2b0a7c5
--- src/cmd/sam/file.c
+++ src/cmd/sam/file.c
#endif
void
-fileinsert(File *f, uint p0, Rune *s, uint ns)
-{
- if(p0 > f->b.nc)
- panic("internal error: fileinsert");
- if(f->seq > 0)
- fileuninsert(f, &f->delta, p0, ns);
- bufinsert(&f->b, p0, s, ns);
- if(ns)
- f->mod = TRUE;
-}
-
-void
fileuninsert(File *f, Buffer *delta, uint p0, uint ns)
{
Undo u;
}
void
-filedelete(File *f, uint p0, uint p1)
-{
- if(!(p0<=p1 && p0<=f->b.nc && p1<=f->b.nc))
- panic("internal error: filedelete");
- if(f->seq > 0)
- fileundelete(f, &f->delta, p0, p1);
- bufdelete(&f->b, p0, p1);
- if(p1 > p0)
- f->mod = TRUE;
-}
-
-void
fileundelete(File *f, Buffer *delta, uint p0, uint p1)
{
Undo u;
raspstart(f);
while(delta->nc > 0){
+ /* rasp and buffer are in sync; sync with wire if needed */
+ if(needoutflush())
+ raspflush(f);
up = delta->nc-Undosize;
bufread(delta, up, (Rune*)&u, Undosize);
if(isundo){
blob - 8250336f3872d879882c3ffc5ac2a6d20b0f0fe9
blob + 529837037b916689d1042b2e305da809394a0e3d
--- src/cmd/sam/mesg.c
+++ src/cmd/sam/mesg.c
#include "sam.h"
-
+#define DEBUG
Header h;
uchar indata[DATASIZE];
uchar outdata[2*DATASIZE+3]; /* room for overflow message */
Posn cmdptadv;
Buffer snarfbuf;
int waitack;
-int noflush;
+int outbuffered;
int tversion;
int inshort(void);
{
int outcount;
+ if(outp >= outdata+nelem(outdata))
+ panic("outsend");
outcount = outp-outmsg;
outcount -= 3;
outmsg[1] = outcount;
outmsg[2] = outcount>>8;
outmsg = outp;
- if(!noflush){
+ if(!outbuffered){
outcount = outmsg-outdata;
if (write(1, (char*) outdata, outcount) != outcount)
rescue();
outmsg = outdata;
return;
}
- if(outmsg < outdata+DATASIZE)
- return;
- outflush();
}
+int
+needoutflush(void)
+{
+ return 1;
+}
+
void
outflush(void)
{
if(outmsg == outdata)
return;
- noflush = 0;
+ outbuffered = 0;
outT0(Hack);
waitack = 1;
do
}
while(waitack);
outmsg = outdata;
- noflush = 1;
+ outbuffered = 1;
}
blob - 829a7b4948ed965c39373eedaab8f106bad8d0f3
blob + 5a6911297f8d48b7e2e6d0c857e61ad65e7771eb
--- src/cmd/sam/rasp.c
+++ src/cmd/sam/rasp.c
* GROWDATASIZE must be big enough that all errors go out as Hgrowdata's,
* so they will be scrolled into visibility in the ~~sam~~ window (yuck!).
*/
-#define GROWDATASIZE 50 /* if size is > this, send data with grow */
+#define GROWDATASIZE 50 /* if size is <= this, send data with grow */
void rcut(List*, Posn, Posn);
int rterm(List*, Posn);
}
void
+raspflush(File *f)
+{
+ if(grown){
+ outTsll(Hgrow, f->tag, growpos, grown);
+ grown = 0;
+ }
+ else if(shrunk){
+ outTsll(Hcut, f->tag, shrinkpos, shrunk);
+ shrunk = 0;
+ }
+ outflush();
+}
+
+void
raspdelete(File *f, uint p1, uint p2, int toterm)
{
long n;
}
return rg;
}
+
blob - ca92c48d7ea2a411d8fc81925c0fa50bc0528399
blob + 4f2f2cfdd9b86e406c53a788848dc3633e84914a
--- src/cmd/sam/sam.h
+++ src/cmd/sam/sam.h
void raspdelete(File*, uint, uint, int);
void raspinsert(File*, uint, Rune*, uint, int);
void raspdone(File*, int);
+void raspflush(File*);
/*
* acme fns
void outTsl(Hmesg, int, long);
void outTsv(Hmesg, int, vlong);
void outflush(void);
-
+int needoutflush(void);