new program acmeevent Reference: /n/atom/patch/applied/acmeevent Date: Fri Feb 28 12:31:11 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/acmeevent.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/acmeevent.c Fri Feb 28 12:31:07 2014 @@ -0,0 +1,92 @@ +#include +#include +#include + +int +getn(Biobuf *b) +{ + int c, n; + + n = 0; + while((c = Bgetc(b)) != -1 && '0'<=c && c<='9') + n = n*10+c-'0'; + if(c != ' ') + sysfatal("bad number syntax"); + return n; +} + +char* +getrune(Biobuf *b, char *p) +{ + int c; + char *q; + + c = Bgetc(b); + if(c == -1) + sysfatal("eof"); + q = p; + *q++ = c; + if(c >= Runeself){ + while(!fullrune(p, q-p)){ + c = Bgetc(b); + if(c == -1) + sysfatal("eof"); + *q++ = c; + } + } + return q; +} + +void +getevent(Biobuf *b, int *c1, int *c2, int *q0, int *q1, int *flag, int *nr, char *buf) +{ + int i; + char *p; + + *c1 = Bgetc(b); + if(*c1 == -1) + exits(0); + *c2 = Bgetc(b); + *q0 = getn(b); + *q1 = getn(b); + *flag = getn(b); + *nr = getn(b); + if(*nr >= 256) + sysfatal("event string too long"); + p = buf; + for(i=0; i<*nr; i++) + p = getrune(b, p); + *p = 0; + if(Bgetc(b) != '\n') + sysfatal("expected newline"); +} + +void +main(void) +{ + int c1, c2, q0, q1, eq0, eq1, flag, nr, x; + Biobuf b; + char buf[2000], buf2[2000], buf3[2000]; + + doquote = needsrcquote; + quotefmtinstall(); + Binit(&b, 0, OREAD); + for(;;){ + getevent(&b, &c1, &c2, &q0, &q1, &flag, &nr, buf); + eq0 = q0; + eq1 = q1; + buf2[0] = 0; + buf3[0] = 0; + if(flag & 2){ + /* null string with non-null expansion */ + getevent(&b, &x, &x, &eq0, &eq1, &x, &nr, buf); + } + if(flag & 8){ + /* chorded argument */ + getevent(&b, &x, &x, &x, &x, &x, &x, buf2); + getevent(&b, &x, &x, &x, &x, &x, &x, buf3); + } + print("event %c %c %d %d %d %d %d %d %q %q %q\n", + c1, c2, q0, q1, eq0, eq1, flag, nr, buf, buf2, buf3); + } +}