#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); } }