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;
}
--
⑨