75b3404110bed4e60eda0fac428bc43e7eef1c3d
6 char *hex2bin
[] = { ['0'] = "0000" , ['1'] = "0001" , ['2'] = "0010" , ['3'] = "0011" , ['4'] = "0100" , ['5'] = "0101" , ['6'] = "0110" , ['7'] = "0111" , ['8'] = "1000" , ['9'] = "1001" , ['A'] = "1010" , ['B'] = "1011" , ['C'] = "1100" , ['D'] = "1101" , ['E'] = "1110" , ['F'] = "1111", ['\n'] = "0000"};
13 int next(struct stream
*f
)
15 if (*f
->buf
== '\0') {
23 int r
=*f
->buf
== '1' ? 1 : 0;
29 int bin2int(struct stream
*f
, int n
)
32 for (int i
= 0; i
<n
; i
++)
37 int parse_packet(struct stream
*f
)
39 int packetversion
= bin2int(f
, 3);
40 int packettype
= bin2int(f
, 3);
46 while (next(f
) == 1) {
47 num
= num
*16+bin2int(f
, 4);
49 num
= num
*16+bin2int(f
, 4);
53 int lengthtypeid
= next(f
);
56 if (lengthtypeid
== 0) {
57 int lengthsubpackets
= bin2int(f
, 15);
60 while (f
->pos
- oldpos
< lengthsubpackets
)
61 packetversion
+= parse_packet(f
);
63 int numsubpackets
= bin2int(f
, 11);
64 for (int i
= 0; i
<numsubpackets
; i
++)
65 packetversion
+= parse_packet(f
);
74 struct stream f
= {.pos
=0, .buf
=""};
76 int r
= parse_packet(&f
);