shithub: aplenty

Download patch

ref: 666191d45413d79a7a462998ebfd300e12af6f13
parent: e173b7ee0d3c26b54531c287d68aac00ec50f199
author: B. Wilson <x@wilsonb.com>
date: Wed Jul 16 13:45:18 EDT 2025

Rationalize with line-oriented input

--- a/aplenty.c
+++ b/aplenty.c
@@ -5,42 +5,58 @@
 #include <json.h>
 #include <regexp.h>
 
-int debug;
+QLock lwin;
+char *rdir;
 vlong caddr;
+int debug;
 
 void
-handlerideevents(int in, int out, int text){
-	Biobuf *bin;
-	char *b, k;   /* event buffer, kind */
+hevride(int in, int ev, int out, int addr){
+	Biobuf *bev;
+	char *b, s[32], k;   /* event buffer, kind */
 	long t, n, o; /*       type, length, offset */
 
-	bin = Bfdopen(in, OREAD);
-	while(b = Brdline(bin, '\n')){
-		Bseek(bin, Blinelen(bin), 1);
+	bev = Bfdopen(ev, OREAD);
+	while(b = Brdline(bev, '\n')){
+		Bseek(bev, Blinelen(bev), 1);
 		k = b[0]; b++;
 		t = atol(strtok(b, " \n"));
 		n = atol(strtok(nil, " \n"));
 		o = atol(b = strtok(nil, " \n"));
 		for(; *b != '\0'; b++); b++;
-		if(debug > 1)
-			fprintf(stderr, "ride: %c %ld %ld %ld %s\n", k, t, n, o);
+		if(debug)
+			fprintf(stderr, "ride: %c %ld %ld %ld\n", k, t, n, o);
 
-		if(k == 'p')
+		qlock(&lwin);
+
+		if(k == 'p'){
+			fprint(addr, "#%lld,$", caddr);
 			write(out, b, n);
+		}
 
-		if(k == 'o' && t != 14){ /* ignore echoed input */
+		if(k == 'o'){
 			b = malloc(n);
-			pread(text, b, n, o);
+			pread(in, b, n, o);
+			if(t == 14)
+				fprint(addr, "#%lld,$", caddr);
+			else
+				fprint(addr, "$");
 			write(out, b, n);
 			free(b);
 		}
+
+		write(addr, "$-/^/", 5);
+		pread(addr, s, 12, 0);
+		caddr = atol(strtok(s, " "));
+
+		qunlock(&lwin);
 	}
 }
 
 void
-handlerootevents(int wid, int in, int out){
+hevroot(int wid, int in, int out){
 	Biobuf *bin, *bxdata, *btag;
-	int fdevent, fdaddr, fdbody;
+	int fdctl, fdevent, fdaddr, fdbody;
 	char o, t;        /* event origin, type */
 	long n, m, f, l;  /*       addr n, addr m, flag, len */
 	Rune *r;          /*       runes */
@@ -51,6 +67,7 @@
 	/* setup files */
 	snprintf(s, sizeof(s), "/mnt/acme/%i", wid);
 	chdir(s);
+	fdctl   = open("ctl", OWRITE);
 	fdevent = open("event", OWRITE);
 	fdaddr  = open("addr", ORDWR);
 	fdbody  = open("body", OWRITE);
@@ -60,7 +77,9 @@
 		exits(s);
 
 	/* initial prompt not setup by ride */
-	write(fdbody, "      ", 6);
+	fprint(fdctl, "name %s/-aplenty\n", rdir);
+	fprint(fdbody, "      ");
+	caddr = 0;
 
 	/* event handle loop: cf acme(4):/event */
 	r = malloc((2+4*12 + 256)*sizeof(*r));
@@ -72,22 +91,15 @@
 		l = atol(Brdline(bin, ' '));
 		for(i = 0; i < l+1; i++) /* trailing LF not counted by l */
 			Bgetrune(bin);
-		if(debug > 1)
+		if(debug)
 			fprintf(stderr, "acme: %c%c%ld %ld %ld %ld\n", o, t, n , m, f, l);
 
-		/* Ride-triggered edits */
-		if(o == 'E'){
-			write(fdaddr, "$-/^/", 5);
-			pread(fdaddr, s, 12, 0);
-			n = atol(strtok(s, " "));
-			caddr = n;
-			continue;
-		}
+		qlock(&lwin);
 
-		/* trailing text may be elided; read canonical source */
+		/* trailing event text may be elided; read canonical source */
 		if(!strchr("Dd", t)){
-			fprint(fdaddr, "#%ld,#%ld", n, m);
 			if(strchr("ILX", t)){
+				fprint(fdaddr, "#%ld,#%ld", n, m);
 				bxdata = Bopen("xdata", OREAD);
 				for(i = 0, c = Bgetrune(bxdata); c >= 0; i++, c = Bgetrune(bxdata))
 					r[i] = c;
@@ -98,24 +110,22 @@
 					r[i] = c;
 				Bterm(btag);
 			}
-			r[i] = t == 'X' ? '\n' : 0;
-	
-			/* XXX: Only execute first line if multiline input */
-			if(t == 'I' && n >= caddr || t == 'X'){
-				fprint(fdaddr, "#%lld,#%ld", caddr, m);
-				bxdata  = Bopen("xdata", OREAD);
-				ln = Brdline(bxdata, '\n');
-				if(ln){
-					write(out, ln, Blinelen(bxdata));
-					write(fdaddr, "$-/^/", 5);
-					pread(fdaddr, s, 12, 0);
-					n = atol(strtok(s, " "));
-					caddr = n;
-				}
-				Bterm(bxdata);
-			}
 		}
 
+		/* Ride-triggered edits */
+		if(strchr("EF", o))
+			goto end;
+
+		/* XXX: Only execute first line if multiline input */
+		if(t == 'I' && n >= caddr || t == 'X'){
+			fprint(fdaddr, "#%lld,#%ld", caddr, m);
+			bxdata  = Bopen("xdata", OREAD);
+			ln = Brdline(bxdata, '\n');
+			if(ln)
+				write(out, ln, Blinelen(bxdata));
+			Bterm(bxdata);
+		}
+
 		if(strchr("ID", t))
 		if((t == 'D') + m < caddr)
 			caddr += t == 'D' ? n-m : m-n;
@@ -122,6 +132,9 @@
 
 		if(f%2 == 0 && strchr("Lidlx", t))
 			fprint(fdevent, "%c%c%ld %ld\n", o, t, n, m);
+
+		end:
+		qunlock(&lwin);
 	}
 }
 
@@ -143,14 +156,9 @@
 void
 main(int argc, char **argv){
 	char *err, *addr, b[256], p[256];
-	int rid, rctl, rin, rout, rtext; /* ride */
-	int wid, wctl, win, wout; /* root window */
+	int rid, rctl, rin, rout, revent; /* ride */
+	int wid, wctl, win, wout, waddr; /* root window */
 
-	if(argc < 1){
-		usage();
-		exits("requires address argument");
-	}
-
 	ARGBEGIN{
 	case 'd': debug++; break;
 	case 'h': usage(); exits(nil);
@@ -172,24 +180,11 @@
 		exits(errmsg(err));
 	sprintf(b, "connect %s\n", addr);
 	write(rctl, b, strlen(b));
-
-	/* connection id */
 	pread(rctl, b, sizeof(b), 0);
 	sprintf(p, "\n");
 	rid = atoi(strtok(b, p));
+	rdir = smprint("/mnt/ride/%d", rid);
 
-	/* establish connection */
-	snprintf(p, sizeof(p), "/mnt/ride/%i/text", rid);
-	if((rout = open(p, OWRITE)) < 0)
-		exits(errmsg(err));
-	if((rtext = open(p, OREAD)) < 0)
-		exits(errmsg(err));
-
-	/* ride i/o files */
-	snprintf(p, sizeof(p), "/mnt/ride/%i/event", rid);
-	if((rin = open(p, OREAD)) < 0)
-		exits(errmsg(err));
-
 	/* new acme window */
 	if((wctl = open("/mnt/acme/new/ctl", OREAD)) < 0)
 		exits(errmsg(err));
@@ -196,22 +191,22 @@
 	readn(wctl, b, 12);
 	wid = atoi(strtok(b, " "));
 
-	/* window i/o files */
-	snprintf(p, sizeof(p), "/mnt/acme/%i/event", wid);
-	if((win = open(p, OREAD)) < 0)
-		exits(errmsg(err));
-	snprintf(p, sizeof(p), "/mnt/acme/%i/body", wid);
-	if((wout = open(p, OWRITE)) < 0)
-		exits(errmsg(err));
-
 	JSONfmtinstall();
-
 	rfork(RFNOTEG);
 
 	switch(rfork(RFPROC|RFMEM)){
 	case -1: err = "unable to start ride message handler"; break;
 	case 0:
-		handlerideevents(rin, wout, rtext);
+		snprintf(p, sizeof(p), "/mnt/ride/%i/text", rid);
+		rin = open(p, OREAD); /* establishes connection */
+		snprintf(p, sizeof(p), "/mnt/ride/%i/event", rid);
+		revent = open(p, OREAD);
+		snprintf(p, sizeof(p), "/mnt/acme/%i/data", wid);
+		wout = open(p, OWRITE);
+		snprintf(p, sizeof(p), "/mnt/acme/%i/addr", wid);
+		waddr = open(p, ORDWR);
+	
+		hevride(rin, revent, wout, waddr);
 		exits(nil);
 	default: break;
 	}
@@ -219,7 +214,12 @@
 	switch(rfork(RFPROC|RFMEM)){
 	case -1: err = "unable to start root window event handler"; break;
 	case 0:
-		handlerootevents(wid, win, rout);
+		snprintf(p, sizeof(p), "/mnt/acme/%i/event", wid);
+		win = open(p, OREAD);
+		snprintf(p, sizeof(p), "/mnt/ride/%i/text", rid);
+		rout = open(p, OWRITE);
+
+		hevroot(wid, win, rout);
 		exits(nil);
 	default: break;
 	}
--