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