plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }