acmeevent.c (1559B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 5 6 int 7 getn(Biobuf *b) 8 { 9 int c, n; 10 11 n = 0; 12 while((c = Bgetc(b)) != -1 && '0'<=c && c<='9') 13 n = n*10+c-'0'; 14 if(c != ' ') 15 sysfatal("bad number syntax"); 16 return n; 17 } 18 19 char* 20 getrune(Biobuf *b, char *p) 21 { 22 int c; 23 char *q; 24 25 c = Bgetc(b); 26 if(c == -1) 27 sysfatal("eof"); 28 q = p; 29 *q++ = c; 30 if(c >= Runeself){ 31 while(!fullrune(p, q-p)){ 32 c = Bgetc(b); 33 if(c == -1) 34 sysfatal("eof"); 35 *q++ = c; 36 } 37 } 38 return q; 39 } 40 41 void 42 getevent(Biobuf *b, int *c1, int *c2, int *q0, int *q1, int *flag, int *nr, char *buf) 43 { 44 int i; 45 char *p; 46 47 *c1 = Bgetc(b); 48 if(*c1 == -1) 49 exits(0); 50 *c2 = Bgetc(b); 51 *q0 = getn(b); 52 *q1 = getn(b); 53 *flag = getn(b); 54 *nr = getn(b); 55 if(*nr >= 256) 56 sysfatal("event string too long"); 57 p = buf; 58 for(i=0; i<*nr; i++) 59 p = getrune(b, p); 60 *p = 0; 61 if(Bgetc(b) != '\n') 62 sysfatal("expected newline"); 63 } 64 65 void 66 main(void) 67 { 68 int c1, c2, q0, q1, eq0, eq1, flag, nr, x; 69 Biobuf b; 70 char buf[2000], buf2[2000], buf3[2000]; 71 72 doquote = needsrcquote; 73 quotefmtinstall(); 74 Binit(&b, 0, OREAD); 75 for(;;){ 76 getevent(&b, &c1, &c2, &q0, &q1, &flag, &nr, buf); 77 eq0 = q0; 78 eq1 = q1; 79 buf2[0] = 0; 80 buf3[0] = 0; 81 if(flag & 2){ 82 /* null string with non-null expansion */ 83 getevent(&b, &x, &x, &eq0, &eq1, &x, &nr, buf); 84 } 85 if(flag & 8){ 86 /* chorded argument */ 87 getevent(&b, &x, &x, &x, &x, &x, &x, buf2); 88 getevent(&b, &x, &x, &x, &x, &x, &x, buf3); 89 } 90 print("event %c %c %d %d %d %d %d %d %q %q %q\n", 91 c1, c2, q0, q1, eq0, eq1, flag, nr, buf, buf2, buf3); 92 } 93 }