|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  |  | 
|  |  | 
|  | 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); | 
|  | } | 
|  | } |