Commit Diff


commit - ad2922ef28f026b8bbd0aee30d92f703613c1486
commit + 78439d25f8b2f6f2289e9f4e4400e0f7cdb5fa70
blob - 875a26c70201ccad53989624860ab5fe0ffffaeb
blob + c0771e058c6e10e319490c69d313147aa2b0a7c5
--- src/cmd/sam/file.c
+++ src/cmd/sam/file.c
@@ -266,18 +266,6 @@ filedeltext(File *f, Text *t)
 #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;
@@ -292,18 +280,6 @@ fileuninsert(File *f, Buffer *delta, uint p0, uint ns)
 }
 
 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;
@@ -499,6 +475,9 @@ fileundo(File *f, int isundo, int canredo, uint *q0p, 
 
 	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
@@ -1,5 +1,5 @@
 #include "sam.h"
-
+#define DEBUG
 Header	h;
 uchar	indata[DATASIZE];
 uchar	outdata[2*DATASIZE+3];	/* room for overflow message */
@@ -10,7 +10,7 @@ Posn	cmdpt;
 Posn	cmdptadv;
 Buffer	snarfbuf;
 int	waitack;
-int	noflush;
+int	outbuffered;
 int	tversion;
 
 int	inshort(void);
@@ -807,29 +807,34 @@ outsend(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
@@ -839,5 +844,5 @@ outflush(void)
 		}
 	while(waitack);
 	outmsg = outdata;
-	noflush = 1;
+	outbuffered = 1;
 }
blob - 829a7b4948ed965c39373eedaab8f106bad8d0f3
blob + 5a6911297f8d48b7e2e6d0c857e61ad65e7771eb
--- src/cmd/sam/rasp.c
+++ src/cmd/sam/rasp.c
@@ -3,7 +3,7 @@
  * 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);
@@ -80,6 +80,20 @@ raspdone(File *f, int toterm)
 }
 
 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;
@@ -323,3 +337,4 @@ rdata(List *r, Posn p1, Posn n)
 	}
 	return rg;
 }
+
blob - ca92c48d7ea2a411d8fc81925c0fa50bc0528399
blob + 4f2f2cfdd9b86e406c53a788848dc3633e84914a
--- src/cmd/sam/sam.h
+++ src/cmd/sam/sam.h
@@ -218,6 +218,7 @@ void		raspstart(File*);
 void		raspdelete(File*, uint, uint, int);
 void		raspinsert(File*, uint, Rune*, uint, int);
 void		raspdone(File*, int);
+void		raspflush(File*);
 
 /*
  * acme fns
@@ -404,4 +405,4 @@ void	outTsll(Hmesg, int, long, long);
 void	outTsl(Hmesg, int, long);
 void	outTsv(Hmesg, int, vlong);
 void	outflush(void);
-
+int needoutflush(void);