mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
94 lines
1.5 KiB
C
94 lines
1.5 KiB
C
|
#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);
|
||
|
}
|
||
|
}
|